我正在使用org.springframework.oxm.jaxb.Jaxb2Marshaller解组我的请求xml。解组失败的原因是'&'请求中的(&符号),即使编码在序言中设置为
requestXML -
<?xml version="1.0" encoding="utf-8"?><createaccountrequest><username>Test&jsongg</username><userpassword>12345</userpassword></createaccountrequest>
我得到的例外情况如下
500 Internal Server Error org.springframework.http.converter.HttpMessageNotReadableException: Could not unmarshal to [class com.marketplace.system.customer.service.component.request.vo.AccountRequestVO]: null; nested exception is javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException: The reference to entity "jsongg1h61" must end with the ';' delimiter.] at org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.readFromSource(Jaxb2RootElementHttpMessageConverter.java:82) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.readInternal(AbstractXmlHttpMessageConverter.java:61) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:153) ~[spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:120) ~[spring-webmvc-3.1.0.RELEASE.jar:3.1.0.RELEASE]
任何指针都会有很大的帮助。
提前致谢
答案 0 :(得分:2)
解析器错误正确为
<username>Test&jsongg</username>
不是格式良好的XML。如果您想在XML中的元素内容中使用&符号,则需要将其转义为&
。
关于XML字符数据的规则 - 哪些字符可以按原样使用,哪些需要转义(以及如何),哪些是完全禁止的,即使是在转义形式中 - 也很复杂,如果你想生成XML,应该使用XML库来实现,而不是尝试手工完成。也就是说,您可以使用CDATA实现您想要的效果。以下 格式良好:
<username><![CDATA[Test&jsongg]]></username>
以<![CDATA[
开头并以]]>
开头的文本块被解析器,&符号,小于号等视为纯文本,失去了它们的特殊含义。这里需要注意的是CDATA部分没有嵌套,所以如果你在CDATA中包装的值包含三个字符子串]]>
,那么这需要通过用某些东西替换它来“转义”例如]]]]><![CDATA[>
(]]
,然后是CDATA部分的结尾,然后立即启动另一个,继续>
)。