Jaxb2Marshaller在'&'的存在下无法解散

时间:2013-01-24 10:04:50

标签: xml web-services spring jaxb2

我正在使用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]

任何指针都会有很大的帮助。

提前致谢

1 个答案:

答案 0 :(得分:2)

解析器错误正确为

<username>Test&jsongg</username>

不是格式良好的XML。如果您想在XML中的元素内容中使用&符号,则需要将其转义为&amp;

关于XML字符数据的规则 - 哪些字符可以按原样使用,哪些需要转义(以及如何),哪些是完全禁止的,即使是在转义形式中 - 也很复杂,如果你想生成XML,应该使用XML库来实现,而不是尝试手工完成。也就是说,您可以使用CDATA实现您想要的效果。以下 格式良好:

<username><![CDATA[Test&jsongg]]></username>

<![CDATA[开头并以]]>开头的文本块被解析器,&符号,小于号等视为纯文本,失去了它们的特殊含义。这里需要注意的是CDATA部分没有嵌套,所以如果你在CDATA中包装的值包含三个字符子串]]>,那么这需要通过用某些东西替换它来“转义”例如]]]]><![CDATA[>]],然后是CDATA部分的结尾,然后立即启动另一个,继续>)。