2016-11-30 6 views
5

対応する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)がこれまでと同じ問題を報告しているようです。

+0

[JDK-8134111:Unmarshallerは、予想される名前空間を持たないXML要素をアンマーシャリングする](http://bugs.java.com/bugdatabase/view_bug.do? bug_id = 8134111)。 – sleske

+1

似たような質問 - https://stackoverflow.com/questions/41608667/axis-jaxb-unmarshal-not-working-with-any-jdk-except-jdk-1-8-077 –

答えて

1

私は、これは、関連するバグだと思う - https://bugs.openjdk.java.net/browse/JDK-8165299

私はJAXBのため修正が実際にあったことを言うことができ、そこから。 null値で終わるこの奇妙な振る舞いは、JAXBマッピングが間違っていて、Javaの回帰ではありません。

+0

Good find。しかし、そのバグは「問題ではない」としてクローズされました。だから修正はありません。 – sleske

+0

JAXBマッピングを修正する必要があると思います。 –

関連する問題