是否可以在使用@XmlElementRef注释的引用对象上使用@XmlValue注释?目标是生成以下XML输出:
<foo>
<bar>Blah</bar>
</foo>
鉴于以下示例,JAXBContext初始化正在抛出NPE: 在com.sun.xml.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:128)
Foo Class
@XmlRootElement(name = "foo")
public class Foo
{
@XmlElementRef
private Bar bar;
}
酒吧类
@XmlRootElement(name = "bar")
public class Bar extends BarBase // BarBase is annotated with @XmlTransient
{
@XmlValue
private String value;
}
有没有办法根据实现实现所需的输出?我一直在研究适配器,但在实现它时没有成功。提前致谢!
答案 0 :(得分:3)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
JAXB RI问题已确认
我已经能够确认您在JAXB RI中看到的问题。我得到以下堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException
at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:113)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:166)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:494)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:311)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:126)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1148)
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:445)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at forum14490548.Demo.main(Demo.java:10)
这是JAXB RI中的错误,我建议您在以下链接中打开一张彩票:
选项#1 - 使用JAXB RI的备用映射
以下映射似乎适用于JAXB RI(使用@XmlElement
代替@XmlElementRef
。
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "foo")
public class Foo
{
@XmlElement
private Bar bar;
}
选项#2 - 使用备用JAXB(JSR-222)提供程序
您的映射是正确的。如果您使用另一个JAXB (JSR-222)提供程序(如EclipseLink MOXy),则不会出现此异常。以下是解释如何使用MOXy作为JAXB提供程序的链接:
答案 1 :(得分:1)
@blaise - 作为解决方法在@XmlAttribute
类中创建可选的@XmlElement
或Bar
答案 2 :(得分:0)
我在这里遇到完全相同的问题。此问题仍然存在于1.8.0_77
。
我绕过了另外一个虚拟属性,提到了user3345125
。
@XmlAttribute
public String getNothing() {
return null;
}