2

我使用 spring web 3.1.1 和 spring oxm 3.1.1。

当 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 marshall。

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

}

我参考了这篇文章.. http://www.ibm.com/developerworks/webservices/library/wa-spring3webserv/index.html

我认为我的来源与文章的示例代码完全相同。

但效果不好。

我感谢您的帮助。

4

1 回答 1

1

自己解决了问题..(笑)

下载 springframework-oxm-3.1.1.source.. 的源代码并记录 org.springframework.oxm.jaxb.Jaxb2Marshaller 类的 orign 异常堆栈跟踪。

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 Object 选择 Resin 的 XmlPaser ...这就是问题所在.. Resin 设置了对 xml 处理很重要的 System Property

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"/>
-->

结论 Resin 的 XmlPaser 和其他 Factory 不具备 springframework-oxm 库的灵活性。

我希望你不要浪费你的时间!

于 2012-12-03T13:00:26.593 回答