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 版本。
我已经为我遇到的问题建立了一个最小的工作示例。这些是 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 版本。