我在 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
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |