Question

i use spring web 3.1.1 and spring oxm 3.1.1.

when jaxb2marshaller attempt to unmarshall xml source to object blow Exception occured.

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]

i configured jaxb2 marshall on my sevlet setting like this.

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

and on the Controller try to unmarshall like this.

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

and My Authentication Object .

@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;
}

}

i refered this article.. http://www.ibm.com/developerworks/webservices/library/wa-spring3webserv/index.html

i think my sources are absolutly same with article's sample code.

but it doesn't work well.

i appreciate your help.

Was it helpful?

Solution

solved problem myself.. (lol)

download the source of springframework-oxm-3.1.1.source.. and logged orign Exception stack trace of org.springframework.oxm.jaxb.Jaxb2Marshaller Class.

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]

as u can see. java UnmarshallerImpl Object choose Resin's XmlPaser... this is the problem.. Resin set the System Property that important for xml handling

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

these Factory Beans are work for springframework-oxm parser. then... it couldn't work.

so i change resin.conf file (maybe [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"/>
-->

Conclusion Resin's XmlPaser and other Factory doesn't have flexibility with springframework-oxm library.

i hope u don't waste ur time!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top