【发布时间】:2018-02-02 13:56:04
【问题描述】:
我有这样的事情:
@XmlRootElement(name = "attribute", namespace = "ns.attrib")
public class Attribute<T> implements AuthEntity {
private String name;
private T value;
@XmlAttribute
@Override
public String getName() {
return name;
}
@Override
public Optional<Set<AuthEntity>> getAuthEntities() {
return Optional.empty();
}
@XmlAttribute
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(getName(), getValue());
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
@SuppressWarnings("rawtypes")
GSAttribute other = (GSAttribute) obj;
if (!name.equals(other.name))
return false;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
}
我必须使用一些自定义接口在基于 xml 的持久层上做一些 CRUD,所以我必须使用 JAXB(版本 2.2.11)编组/解组上述类型。好的,让我们从一些测试开始以对此充满信心。我写了几篇:
@Test
public void deserializeEmptyAttribute() throws JAXBException {
String xml = "<attribute />";
Attribute expected = new Attribute<>();
Attribute actual = JAXB.unmarshal(new StringReader(xml), Attribute.class);
Assert.assertEquals(expected, actual);
}
@Test
public void deserializeIntegerAttribute() throws Exception {
String xml = "<attribute name=\"somename\" value=\"105\"/>";
Attribute<Integer> expected = new Attribute<>();
expected.setName("somename");
expected.setValue(105);
Attribute actual = JAXB.unmarshal(new StringReader(xml), Attribute.class);
Assert.assertEquals(expected, actual);
}
@Test
public void deserializeStringAttribute() {
String xml = "<attribute name=\"somename\" value=\"somevalue\"/>";
Attribute<String> expected = new Attribute<>();
expected.setName("somename");
expected.setValue("somevalue");
Attribute actual = JAXB.unmarshal(new StringReader(xml), Attribute.class);
Assert.assertEquals(expected, actual);
}
每个测试都因此堆栈而失败:
java.lang.NullPointerException
at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor.get(TransducedAccessor.java:167)
at com.sun.xml.bind.v2.runtime.property.AttributeProperty.<init>(AttributeProperty.java:91)
at com.sun.xml.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:108)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:181)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:503)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:320)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:139)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1138)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:162)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:441)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at javax.xml.bind.JAXB$Cache.<init>(JAXB.java:112)
at javax.xml.bind.JAXB.getContext(JAXB.java:139)
at javax.xml.bind.JAXB.unmarshal(JAXB.java:242)
...
我对 JAXB 还是很陌生(大多数年前忘记了),并且在运行测试时遇到了一些麻烦。我错过了什么?我看到有很多类似的帖子/答案,但它们没有帮助(或者我没有得到它们)。
【问题讨论】: