状況
EclipseLinkのMOXyを使用しており、Mapインターフェイスを実装するクラスで外部OXマッピングXMLを使用しようとしています。ただし、JAXBContextを作成しようとするたびに、次のNPEが取得されます。
Caused by: javax.xml.bind.JAXBException
- with linked exception:
[java.lang.NullPointerException]
at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:832)
at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:143)
at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:142)
at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:129)
at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:93)
at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:83)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:210)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:336)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
at com.example.MOXyOXTest<clinit>(MOXyOXTest.java:59)
Caused by: java.lang.NullPointerException
at org.eclipse.persistence.jaxb.compiler.XMLProcessor.processXML(XMLProcessor.java:202)
at org.eclipse.persistence.jaxb.compiler.Generator.<init>(Generator.java:145)
at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:829)
詳細
この問題は、マップされているクラスがjava.util.Mapインターフェースを実装している場合にのみ発生します。マッピングしているクラスがそのインターフェースを実装していない場合、すべてが正常に機能します。これが私がマップしようとしているクラスの単純化された例です:
package com.example;
import java.util.Map;
// This class just wraps a java.util.HashMap
import com.xetus.lib.type.DelegatedMap;
public class SampleClassA extends DelegatedMap<String, Object>{
public SampleClassA(){
super();
}
public SampleClassA(Map<String, Object> m){
super(m);
}
public void setSomeProperty(String value){
put("somevalue", value);
}
public String getSomeProperty(){
return (String) get("somevalue");
}
}
これが私が使用したいMOXyOXメタデータの簡略化されたサンプルです:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="com.example"
xml-mapping-metadata-complete="true">
<java-types>
<java-type name="SampleClassA" xml-accessor-type="NONE">
<xml-root-element name="SAMPLE" />
<java-attributes>
<xml-attribute type="java.lang.String" name="SomeProperty" required="true">
<xml-access-methods get-method="getSomeProperty" set-method="setSomeProperty"/>
</xml-attribute>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
JAXBContextを作成する方法は次のとおりです
Map<String, Object> props = new HashMap<String, Object>(1);
List bindings = new ArrayList(1);
bindings.add(new StreamSource(MOXyOXTest.class.getResourceAsStream("test-mappings.xml")));
props.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, bindings);
cntxt = JAXBContext.newInstance(new Class[] { SampleClassA.class }, props);
重要な場合に備えて、EclipseLinkバージョン2.3.2を使用しています。バージョン2.2.1でも試してみましたが、同じ結果になりました。
私の質問
java.util.Mapインターフェースを実装するクラスでJAXBを使用しようとしたのはこれが初めてで、基本的なものが欠けているかどうか知りたいです。OXマッピングがマップの名前/値のペアで機能することは期待していませんが、代わりに、クラスに追加されたカスタムのゲッターとセッターで機能します。
このような構成は機能するはずですか?
追加の詳細
- サンプルコードで使用されているDelegatedMapは、 java.util.HashMapを拡張せず、インスタンスをラップしてMapインターフェイスを実装するだけです。また、そのクラスには@XmlAccessorType(XmlAccessType.NONE)という注釈が付けられています。
- SampleClassAに使用するMapインターフェイスを実装する抽象クラスに関係なく、同じエラーが発生します。SampleClassAがマップを実装しないクラスを拡張する場合、すべてが正しく動作します。
- 私が使用しているコードベースでは、Mapインターフェイスを実装するために多くのクラスが必要です。