対応するJavaフィールドに名前空間の注釈がないかぎり、JAXBがXML要素を非整列化することを拒否する状況に遭遇しました。この動作は、JDK 1.8.0_111(または102の場合のみ)から開始されました。以前のバージョンのJDK 1.8は動作します。JAXB:アンマーシャリング時に名前空間の注釈が継承されない - JDK 1.8_102の回帰?
テストケース:
Javaクラス(短縮):
package my.package;
@XmlRootElement(name = "MyElement", namespace="myns")
public class MyElement {
@XmlElement(name = "subEl")
private String subEl;
}
XML:
<MyElement xmlns="myns">
<subEl>text1</subEl>
</MyElement>
package-info.java:
@XmlSchema(elementFormDefault = XmlNsForm.QUALIFIED)
package my.package;
アンマーシャリングコード:
JAXBContext jc = JAXBContext.newInstance(MyElement.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MyElement myel = (MyElement) unmarshaller.unmarshal(xmlStream);
System.out.println("Parse result: "+ myel);
JDK 1.8.0_101(以前)を使用してこのプリント:
解析結果:JDK 1.8.0_111 IでMYELEMENT [subEl = subEl]
get:
解析結果:MyElement [subEl = null]
したがって、JDK 1.8.0_111は要素 "MyElement"を非整列化することを拒否します。
私は、フィールドの注釈に名前空間を指定した場合:
@XmlElement(name = "subEl", namespace="myns")
private String subEl;
すべてのJDKのバージョンに期待どおりに動作します。
ここでは何が起こっていますか?
私が理解する限り、設定elementFormDefault = XmlNsForm.QUALIFIED
は、クラスMyElementのすべてのフィールドにクラスの名前空間を継承させる必要があります。 Javadocs for @XmlElement
は言う:
値が「##時のデフォルト」の場合、名前空間が のように決定され、次のとおりです。
を囲んでいるパッケージはXMLSCHEMAアノテーションを持っており、その のelementFormDefaultが修飾されている場合は、同封の クラスの名前空間。そうでない場合は ''(デフォルト 名前空間で修飾されていない要素を生成する
デフォルト: "##デフォルト"
はなぜJDK 1.8.0_111は、要素を非整列化しない
注意を! :JAXBのバグ報告#1087 - Unmarshalling Wrapped elements with elementForName=qualified fails(以前はJAXB-1087- Unmarshalling Wrapped elements with elementForName=qualified fails)がこれまでと同じ問題を報告しているようです。
[JDK-8134111:Unmarshallerは、予想される名前空間を持たないXML要素をアンマーシャリングする](http://bugs.java.com/bugdatabase/view_bug.do? bug_id = 8134111)。 – sleske
似たような質問 - https://stackoverflow.com/questions/41608667/axis-jaxb-unmarshal-not-working-with-any-jdk-except-jdk-1-8-077 –