MOXy JAXB 在 XmlIDREF 上中断为具有枚举属性的类型

MOXy JAXB breaks on XmlIDREF to type that has an enum attribute

我已经为我遇到的问题建立了一个最小的工作示例。这些是 JAXB 类.

moxytest/A.java

package moxytest;
@XmlRootElement
public class A {

    @XmlElement(name = "b")
    public List<B> bs;

    @XmlElement(name = "c")
    public List<C> cs;
}

moxytest/B.java

package moxytest;    
public class B {

    @XmlAttribute
    @XmlID
    public String id;

    @XmlAttribute
    public EnumD md;
}

moxytest/C.java

package moxytest;
public class C {

    @XmlAttribute
    @XmlIDREF
    public B b;
}

moxytest/EnumD.java

package moxytest;
@XmlEnum
public enum EnumD {

    VALUE1, VALUE2, VALUE3
}

示例输入:

<?xml version="1.0" encoding="UTF-8" ?>
<a>
    <b id="b1" md="VALUE1"/>
    <b id="b2" md="VALUE2"/>
    <b id="b3" md="VALUE3"/>
    <c b="b2"/>
    <c b="b1"/>
    <c b="b3"/>
</a>

因此 C 元素通过 id 引用 B 元素,并且 B 元素具有 Enum 属性。

这行Java代码

JAXBContext context = JAXBContext.newInstance(A.class);

产生异常并显示以下消息:

The @XmlAttribute property b in type moxytest.C must reference a type that maps to text in XML. moxytest.B cannot be mapped to a text value.

我一直在调试和阅读一些 MOXy 源代码。这就是我能够设置这个最小示例的方式。 JDK 实现工作正常。

编辑:

我正在使用 EclipseLink 2.6.0(感谢 Santhosh Kumar Tekuri)

我使用以下 Maven 依赖项测试了您的代码:

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.5.0</version>
</dependency>

我将 jaxb.properties 放在模型 类 存在的同一个包中。此文件包含:

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

而且效果很好。下面是我的解组代码:

public static void main(String[] args) throws Exception{
    JAXBContext context = JAXBContext.newInstance(A.class);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    Object obj = unmarshaller.unmarshal(new File("input.xml"));
    System.out.println(obj);
}

确保您使用的是与我相同的 moxy 版本。