当前位置: 首页 > 知识库问答 >
问题:

将JAXB@XmlValue与@XmlElementRef一起使用

越高峻
2023-03-14

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

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

给定以下示例,JAXBContext初始化抛出NPE:at com . sun . XML . bind . v2 . runtime . property . property factory . create(property factory . 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;
     }

有没有办法根据实现实现所需的输出?我一直在研究适配器,但还没有成功实现一个。提前致谢!

共有3个答案

林铭
2023-03-14

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

正如< code>user3345125提到的,我用一个额外的伪属性绕过了它。

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

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

仲孙磊
2023-03-14

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

章晗日
2023-03-14

注意:我是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中的一个错误,我建议您在以下链接中打开问题:

  • http://java.net/jira/browse/JAXB/

选项#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) 提供程序(如日食链接 MOXy),则不会得到此异常。下面是一个链接,解释了如何使用 MOXy 作为 JAXB 提供程序:

    < Li > http://blog . b doughan . com/2011/05/specifying-eclipse link-moxy-as-your . html
 类似资料:
  • 这似乎是一个基本问题,但我无法在其他地方找到答案。如果这是一个重复的帖子,请原谅。 是否可以对标记为@XmlAccessorType(XmlAccessType. FIELD)的类进行@XmlValue注释? 我正在尝试使用JAXB解析XML文件,虽然XML本身很大并且有其他字段,但问题特定于此字段: 映射为: 该字段在XML中声明为令牌类型。 @XmlValue注释给我一个IllegalAnno

  • 我有下一个html,我想解析它: 我有下一节课: 和: 现在,我还需要跨度的值(“bla-bla”)。因此,我将添加到类中: 位它给了我下一个错误: 我尝试使用@XMLMixed,但是没有成功。我会很高兴,例如代码的例子。谢了。

  • 是否有可能有一个使用值 AND 元素呈现的 JAXB 元素? 我正在尝试渲染类似下面的内容: 它甚至可能不是有效的XML,但不幸的是,我试图渲染的东西需要它,而不是可选的。 如果有一个值和元素,则会给出一个。

  • 我正在尝试创建一个可以同时包含元素和值的java/jaxb类。 我想在A类的列表中读取一个类的属性,并作为A类本身的值输出。 这是XML: 我必须阅读: 并生产: 这是我的错误类-工作正常: 我的设备类别: Jaxb 抱怨我不能在同一类中同时拥有 xml 元素(错误 )和 xml 值 如何正确建模/注释此内容,以允许我读取 error xml 标记的属性并将其生成为设备标记的值?

  • 问题内容: 我有下一个html,我想解析: 我下一堂课: 和: 现在,我还需要span的值(“ bla bla”)。所以我添加到类中: 有点给我下一个错误: 我尝试使用@XMLMixed,但没有成功。我会很高兴例如代码示例。谢谢。 问题答案: 更新 可以同时具有文本和元素的子注释的任何元素都称为混合内容。在JAXB中,这对应于注释。 可以在自家的集合属性使用(见原来的答复),或组合,或。如果该元素

  • 嗨,我正在解组一个XML文件,该文件有一个标记,可以包含值或元素列表。我想知道解组这种XML的最佳方法是什么。例子: 我无法改变XML的构建方式,因此我希望有人能给出答案。非常感谢。