首页 > 解决方案 > 如何使用 Spring WebServiceTemplate 正确配置编组

问题描述

我一直在尝试弄清楚如何正确配置 WebServiceTemplate 的编组。我使用 Spring Web Services 只是为了将 WebServiceTemaplate 作为客户端与我无法控制的后端进行通信。Jaxb2 将所需的类从 xsd 预先转换为 POJO,我正在使用生成的 ObjectFactory 来正确创建请求对象。

我的问题是我SsiConfigJaxb2Marshaller课堂上所做的所有配置都没有在生成的 XML 中表示。不用于转义特殊字符,DumbEscapeHandler并且 XML 声明未显示更改的编码(始终<?xml version="1.0" encoding="UTF-8" standalone="no"?>如此,我没有找到更改它的方法)。此外,选项JAXB_FRAGMENTJAXB_FORMATTED_OUTPUT根本不会更改编组结果。

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

这是我的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, 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;
    }
}

标签: springjaxbmarshallingspring-ws

解决方案


推荐阅读