spring - 如何使用 Spring WebServiceTemplate 正确配置编组
问题描述
我一直在尝试弄清楚如何正确配置 WebServiceTemplate 的编组。我使用 Spring Web Services 只是为了将 WebServiceTemaplate 作为客户端与我无法控制的后端进行通信。Jaxb2 将所需的类从 xsd 预先转换为 POJO,我正在使用生成的 ObjectFactory 来正确创建请求对象。
我的问题是我SsiConfig
在Jaxb2Marshaller
课堂上所做的所有配置都没有在生成的 XML 中表示。不用于转义特殊字符,DumbEscapeHandler
并且 XML 声明未显示更改的编码(始终<?xml version="1.0" encoding="UTF-8" standalone="no"?>
如此,我没有找到更改它的方法)。此外,选项JAXB_FRAGMENT
和JAXB_FORMATTED_OUTPUT
根本不会更改编组结果。
我很确定我在这里做错了,但是通过框架类进行的长时间调试会话并没有帮助我解决这个问题。
这是我的WebServiceTemplate
和Jaxb2Marshaller
配置:
@Configuration
@Import(SsiClientSecurityConfig.class)
public class SsiConfig
{
@Bean
public SsiClient ssiClient(
@Value("${url}") final String url,
@Value("${url.alternative}") final String urlAlternative,
final Jaxb2Marshaller marshaller,
@Autowired final HttpComponentsMessageSender messageSender
)
{
final WebServiceTemplate template = new WebServiceTemplate();
template.setMarshaller(marshaller);
template.setUnmarshaller(marshaller);
template.setDefaultUri(url);
template.setMessageFactory(new DomPoxMessageFactory());
template.setMessageSender(messageSender);
return new SsiClient(template, url, urlAlternative);
}
@Bean
public Jaxb2Marshaller jaxb2Marshaller()
{
final Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("my.interface.package");
marshaller.setCheckForXmlRootElement(true);
marshaller.setSupportDtd(true);
marshaller.setSupportJaxbElementClass(false);
marshaller.setMarshallerProperties(
Map.of(
Marshaller.JAXB_ENCODING, StandardCharsets.ISO_8859_1.toString(),
Marshaller.JAXB_FRAGMENT, false,
Marshaller.JAXB_FORMATTED_OUTPUT, false,
"com.sun.xml.bind.marshaller.CharacterEscapeHandler", DumbEscapeHandler.theInstance,
"com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?>"
)
);
marshaller.setUnmarshallerProperties(
Map.of(
Marshaller.JAXB_ENCODING, StandardCharsets.ISO_8859_1.toString()
)
);
return marshaller;
}
}
解决方案
推荐阅读
- python - <,> 和 == 之间的运行时差异(python)
- apache - Apache的优先级
指令? - amazon-web-services - 亚马逊 ec2 如何使用负载均衡器将域名路由到实例?
- javascript - 如何使用 d3 在 JavaScript 中正确地将函数作为参数提供
- c - 有人知道 SOCKET.H 的 Watcom .lib 文件吗?
- javascript - 如果 axios post 有多个输入,如何仅将一个值的邮件发送到后端
- mysql - 在 MySQL 中使用 CAST() 将 VARCHAR 转换为 CHAR,但最终结果仍然是 VARCHAR 而不是 CHAR
- python - PyTorch 模型在新机器上第一次加载需要太多时间
- docker - docker no_proxy不生效
- android - KitKat 服务图标上的红色方块