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

および 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;
}

}

この記事を参照しました.. 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 クラスの例外スタック トレースをダウンロードします。

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 オブジェクトは、Resin の XmlPaser を選択します...これが問題です..Resin は、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"/>
-->

まとめ Resin の XmlPaser やその他の Factory は、springframework-oxm ライブラリに対して柔軟性がありません。

時間を無駄にしないでほしい!

于 2012-12-03T13:00:26.593 に答える