如何使用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_FRAGMENTJAXB_FORMATTED_OUTPUT根本不会改变编组结果。

我很确定自己在这里做错了什么,但是通过Framework类进行的长时间调试会议并没有帮助我解决这个问题。

这是我的WebServiceTemplateJaxb2Marshaller配置:

@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 (将#修改为@)