2012-12-03 27 views
2

我使用Spring的web 3.1.1和春季OXM 3.1.1。UnmarshalException在Spring 3.1的RESTful服務使用XML請求

時jaxb2marshaller嘗試和解組XML源到對象 吹塑異常發生。

2012-12-03 13:38:41,152[k.c.s.s.c.r.AuthenticationController:154][ERROR] JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: Namespace URIs and local names to the unmarshaller needs to be interned 
org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: Namespace URIs and local names to the unmarshaller needs to be interned 
at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:761) ~[org.springframework.oxm-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:682) ~[org.springframework.oxm-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:665) ~[org.springframework.oxm-3.1.1.RELEASE.jar:3.1.1.RELEASE] 

我配置我喜歡這個sevlet設置JAXB2馬歇爾。

<oxm:jaxb2-marshaller id="marshaller"> 
    <oxm:class-to-be-bound name="kr.co.skcomms.simon.bean.rest.Authentication" /> 
</oxm:jaxb2-marshaller> 

並在控制器上嘗試像這樣解組。

@Autowired 
public Jaxb2Marshaller marshaller; 
.... 
Source source = new StreamSource(new StringReader(body)); 
Authentication authentication = (Authentication) marshaller.unmarshal(source); 

與我的認證對象。

@XmlRootElement 
public class Authentication { 
private String simon_auth; 

private String client_ip; 

private String request_url; 

public Authentication(){ 
} 

@XmlElement 
public String getSimon_auth() { 
    return simon_auth; 
} 

public void setSimon_auth(String simon_auth) { 
    this.simon_auth = simon_auth; 
} 

@XmlElement 
public String getClient_ip() { 
    return client_ip; 
} 

public void setClient_ip(String client_ip) { 
    this.client_ip = client_ip; 
} 

@XmlElement 
public String getRequest_url() { 
    return request_url; 
} 

public void setRequest_url(String request_url) { 
    this.request_url = request_url; 
} 

}

我refered這篇文章.. http://www.ibm.com/developerworks/webservices/library/wa-spring3webserv/index.html

我認爲我的消息來源是與本文的示例代碼是絕對相同的。

,但它不能很好地工作。

我感謝你的幫助。

回答

1

解決的問題自己..(笑)

下載springframework的-OXM-3.1.1.source源.. 並記錄org.springframework.oxm.jaxb.Jaxb2Marshaller類的生產地異常堆棧跟蹤。

2012-12-03 21:28:14,864[o.s.o.j.Jaxb2Marshaller:698][DEBUG] [JAXBException] : javax.xml.bind.UnmarshalException: Namespace URIs and local names to the unmarshaller needs to be interned. 
javax.xml.bind.UnmarshalException: Namespace URIs and local names to the unmarshaller needs to be interned. 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:631) ~[na:1.6.0_16] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:236) ~[na:1.6.0_16] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:231) ~[na:1.6.0_16] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:103) ~[na:1.6.0_16] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1038) ~[na:1.6.0_16] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:467) ~[na:1.6.0_16] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:448) ~[na:1.6.0_16] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137) ~[na:1.6.0_16] 
    at com.caucho.xml.XmlParser.addElement(XmlParser.java:2615) ~[resin.jar:3.1.0] 
    at com.caucho.xml.XmlParser.parseElement(XmlParser.java:663) ~[resin.jar:3.1.0] 
    at com.caucho.xml.XmlParser.parseNode(XmlParser.java:381) ~[resin.jar:3.1.0] 
    at com.caucho.xml.XmlParser.parseInt(XmlParser.java:256) ~[resin.jar:3.1.0] 
    at com.caucho.xml.AbstractParser.parse(AbstractParser.java:644) ~[resin.jar:3.1.0] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200) ~[na:1.6.0_16] 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173) ~[na:1.6.0_16] 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) ~[na:1.6.0_16] 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:105) ~[na:1.6.0_16] 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:694) [classes:na] 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:672) [classes:na] 

你可以看到。 java的UnmarshallerImpl對象選擇樹脂的XmlPaser ... 這是問題..樹脂設置系統屬性,對XML處理的重要

javax.xml.parsers.DocumentBuilderFactory 
javax.xml.parsers.SAXParserFactory 

這些工廠bean是springframework的-OXM解析器的工作。那麼......它無法工作。

,所以我改變resin.conf中文件(也許[resin_dir] /conf/resin.conf)

<!-- Uncomment to use Resin's XML implementations 
- 
- <system-property javax.xml.parsers.DocumentBuilderFactory 
-     ="com.caucho.xml.parsers.XmlDocumentBuilderFactory"/> 
- <system-property javax.xml.parsers.SAXParserFactory 
-     ="com.caucho.xml.parsers.XmlSAXParserFactory"/> 
--> 

結論 樹脂的XmlPaser和其他工廠沒有與springframework的-OXM庫的靈活性。

我希望你不要浪費時間烏爾!

相關問題