gpt4 book ai didi

java - 将 MOXy 的元数据与实现 java.util.Map 的类一起使用时的 NPE

转载 作者:搜寻专家 更新时间:2023-11-01 03:27:22 30 4
gpt4 key购买 nike

情况

我正在使用 EclipseLink 的 MOXy,我正在尝试将外部 OX 映射 XML 与实现 Map 接口(interface)的类一起使用。但是,每次我尝试创建 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 接口(interface)时才会出现此问题。如果我正在映射的类没有实现该接口(interface),则一切正常。这是我尝试映射的类的简化示例:

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 接口(interface)的类上使用 JAXB,我很好奇我是否遗漏了一些基本的东西。我不希望 OX 映射与 Map 的名称/值对一起工作,而是与添加到类中的自定义 getter 和 setter 一起工作。

这样的配置应该有效吗?

其他详细信息

  1. 示例代码中使用的 DelegatedMap 没有扩展 java.util.HashMap,它只是封装了一个实例并实现了 Map 接口(interface)。此外,该类使用 @XmlAccessorType(XmlAccessType.NONE) 进行注释。
  2. 无论哪个抽象类实现了我用于 SampleClassA 的 Map 接口(interface),我都会得到同样的错误。如果 SampleClassA 扩展了一个未实现映射的类,则一切正常。
  3. 我正在使用的代码库需要许多类来实现 Map 接口(interface)。

最佳答案

注意:我是 EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导和成员专家组。

这是一个非常有趣的用例。 JAXB (JSR-222) 具有映射和域对象的表示,因此考虑混合对象的行为方式很有趣。我添加了以下增强请求以引入对它的支持:


更新

我们刚刚完成了此增强功能的实现。从 2012 年 4 月 19 日开始,您可以从以下位置使用 EclipseLink 2.4.0 每晚下载进行试用:

修复涉及利用 super-type 属性指定父类(super class)型来覆盖真正的父类(super class)型。 super-type 属性以前仅被我们的 dynamic JAXB 使用支持。

bindings.xml

<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum10075634">
<java-types>
<java-type name="SampleClassA" super-type="java.lang.Object" xml-accessor-type="NONE">
<xml-root-element name="SAMPLE" />
<java-attributes>
<xml-attribute java-attribute="someProperty" name="SomeProperty" required="true"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>

DelegatedMap

下面是您问题中描述的 DelegatatedMap 类的实现。

package forum10075634;

import java.util.*;

public class DelegatedMap<K,V> implements Map<K,V> {

private Map<K,V> map;

public DelegatedMap() {
map = new HashMap<K,V>();
}

public DelegatedMap(Map<K,V> map) {
this.map = map;
}

public void clear() {
map.clear();
}

public boolean containsKey(Object key) {
return map.containsKey(key);
}

public boolean containsValue(Object value) {
return map.containsValue(value);
}

public Set<java.util.Map.Entry<K, V>> entrySet() {
return map.entrySet();
}

public V get(Object key) {
return map.get(key);
}

public boolean isEmpty() {
return map.isEmpty();
}

public Set<K> keySet() {
return map.keySet();
}

public V put(K key, V value) {
return map.put(key, value);
}

public void putAll(Map<? extends K, ? extends V> m) {
map.putAll(m);
}

public V remove(Object key) {
return map.remove(key);
}

public int size() {
return map.size();
}

public Collection<V> values() {
return map.values();
}

}

样本类A

package forum10075634;

import java.util.Map;

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

}

jaxb.properties

要将 MOXy 指定为您的 JAXB 提供者,您需要在与您的域类相同的包中添加一个名为 jaxb.properties 的文件,其中包含以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

package forum10075634;

import java.io.StringReader;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class Demo {

public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum10075634/bindings.xml");
JAXBContext jc = JAXBContext.newInstance(new Class[] {SampleClassA.class}, properties);

StringReader xml = new StringReader("<SAMPLE SomeProperty='Foo'/>");
Unmarshaller unmarshaller = jc.createUnmarshaller();
SampleClassA sampleClassA = (SampleClassA) unmarshaller.unmarshal(xml);

System.out.println(sampleClassA.getSomeProperty());
System.out.println(sampleClassA.get("somevalue"));

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(sampleClassA, System.out);
}

}

输出

Foo
Foo
<?xml version="1.0" encoding="UTF-8"?>
<SAMPLE SomeProperty="Foo"/>

关于java - 将 MOXy 的元数据与实现 java.util.Map 的类一起使用时的 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10075634/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com