3

是否可以在使用 @XmlElementRef 注释的引用对象上使用 @XmlValue 注释?目标是生成以下 XML 输出:

    <foo>
       <bar>Blah</bar>
    </foo>

给定以下示例 JAXBContext 初始化正在引发 NPE:在 com.sun.xml.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:128)

Foo 类

     @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;
     }

有没有什么方法可以根据实现来实现所需的输出?我一直在研究适配器,但没有成功实施。提前致谢!

4

3 回答 3

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 提供程序:

于 2013-01-24T00:42:34.857 回答
1

@blaise - 作为一种解决方法,在类中创建一个可选的@XmlAttribute@XmlElementBar

于 2014-02-24T04:08:11.390 回答
0

我来这里是为了完全相同的问题。这个问题仍然存在1.8.0_77

user3345125如前所述,我绕过了一个额外的虚拟属性。

@XmlAttribute
public String getNothing() {
    return null;
}

对于任何想追查的人。https://github.com/javaee/jaxb-v2/issues/1027

于 2016-04-12T10:13:00.263 回答