2013-01-24 135 views
1

我正在使用org.springframework.oxm.jaxb.Jaxb2Marshaller解開我的請求xml。解組失敗,因爲即使編碼的序幕設置爲Jaxb2Marshaller無法解析存在'&'

請求「&」(符號)的存在

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] 

任何指針將是一個很大的幫助。

在此先感謝

回答

2

<username>Test&jsongg</username> 

沒有很好地形成XML解析器錯誤是正確的。如果您想在XML中的元素內容中使用&符號,則需要將其轉義爲&amp;

有關XML字符數據的規則 - 哪些字符可以用作原始字符,哪些字符可以被轉義(以及如何轉義),哪些字符是完全禁止的,即使是轉義形式也是如此 - 是複雜的,如果您想要生成XML你應該使用一個XML庫來做到這一點,而不是試圖手動完成。也就是說,你可能能夠使用CDATA來實現你想要的。下面以及形成:首先是<![CDATA[

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

塊和被視爲解析器純文本,與號,小於號標牌等失去了特殊的意義與]]>結束。需要注意的是CDATA部分不會嵌套,所以如果你在CDATA中打包的值包含三個字符子字符]]>那麼這需要通過用]]]]><![CDATA[>]],然後CDATA部分結束並立即開始另一個,繼續執行>)。

+0

感謝您的回覆。 「&」是UTF-8編碼下的有效字符。 我已經使用「&」,它的工作原理,但我想另一種方式使用「&」,以便客戶端不必使用「&」。 例如Jaxb2Marshaller屬性(如果有的話)。 – Soutrick

+1

@Soutrick問題不在於字符編碼,而是它包含未轉義的&符號_isn't XML_的字符串,以及XML分析器_must_在嘗試解析此類數據時引發錯誤。我已經用一些替代的可能性編輯了我的答案。 –

+0

謝謝伊恩。 現在它真的很有幫助。 – Soutrick