问题描述
我一直在尝试弄清楚如何为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
根本不会改变编组结果。
我很确定自己在这里做错了什么,但是通过Framework类进行的长时间调试会议并没有帮助我解决这个问题。
这是我的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,"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;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)