情况
我正在使用 EclipseLink 的 MOXy,并且正在尝试将外部 OX 映射 XML 与实现 Map 接口的类一起使用。但是,每次我尝试创建 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");
}
}
这是我想使用的 MOXy OX 元数据的简化示例:
<?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 映射与 Map 的名称/值对一起使用,而是与添加到类中的自定义 getter 和 setter 一起使用。
这样的配置应该工作吗?
额外细节
- 示例代码中使用的 DelegatedMap 没有扩展java.util.HashMap,它只是包装了一个实例并实现了 Map 接口。此外,该类使用@XmlAccessorType(XmlAccessType.NONE) 进行注释。
- 无论哪个抽象类实现了我用于 SampleClassA 的 Map 接口,我都会遇到相同的错误。如果 SampleClassA 扩展了一个未实现映射的类,则一切正常。
- 我正在使用的代码库需要许多类来实现 Map 接口。