防止 Spring JAXB 上的字符转义

İlk*_*nel 7 spring jaxb

我在 SOAP 请求中使用 String 类作为请求对象类型。

我需要禁用 JAXB 转义并编写如下代码:

@Bean
public Jaxb2Marshaller jaxb2Marshaller() {
    Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("jaxb.formatted.output", true);
    jaxb2Marshaller.setPackagesToScan("packageName");
    map.put("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler",
            new CharacterEscapeHandler() {
                @Override
                public void escape(char[] ac, int i, int j, boolean flag,
                                   Writer writer) throws IOException {
                    writer.write(ac, i, j);
                }
            });
    jaxb2Marshaller.setMarshallerProperties(map);

    return jaxb2Marshaller;
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为 Spring 不接受 com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler 属性来禁用字符转义。它给出这样的错误:

2022-01-07 19:39:41.124 ERROR 45808 --- [ter.container-1] c.p.d.g.s.SendMailService                : org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler value: com.paycore.delivery.gate.soap.SOAPConfig$1@2fbb54f6
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:955)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.createMarshaller(Jaxb2Marshaller.java:731)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java:701)
    at org.springframework.ws.support.MarshallingUtils.marshal(MarshallingUtils.java:81)
    at org.springframework.ws.client.core.WebServiceTemplate$2.doWithMessage(WebServiceTemplate.java:399)
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:590)
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:378)
Run Code Online (Sandbox Code Playgroud)

如何禁用 Jaxb2Marshaller 对象上的字符转义?

小智 0

According to jaxb-ri, and depending if targeting jaxb2 (javax based) or jaxb4 (jakarta based), you can use the following syntax :

jaxb2

map.put(
    "com.sun.xml.bind.marshaller.CharacterEscapeHandler",
    new CustomCharacterEscapeHandler())
Run Code Online (Sandbox Code Playgroud)

Sample source here

jaxb3 and jaxb4

map.put(
    "org.glassfish.jaxb.characterEscapeHandler",
    new CustomCharacterEscapeHandler())
Run Code Online (Sandbox Code Playgroud)

Sample source here