我想要这样的XML:
<simple>Foo</simple>
我可以通过看起来像这样的JAXB类成功地完成这个:
@XmlRootElement(name="simple")
class Simple {
@XmlValue
public String contents;
}
但是现在我需要让Simple类成为另一个类的子类,如下所示:
@XmlRootElement(name="simple")
class Simple extends OtherClass {
@XmlValue
public String contents;
}
失败了@XmlValue is not allowed on a class that derives another class.
我无法轻易地重构超类(因为我们在包装类上使用@XmlElementRef的方式)。有没有一种解决方法可以让我注释我的子类来生成那个简单的XML?
答案 0 :(得分:12)
接受的答案对我不起作用。
所描述的一切都很好,但我还需要将@XmlTransient添加到超类
答案 1 :(得分:7)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。
MOXy支持此用例,JHOB RI也应支持IMHO:
<强>简单强>
此类的字段映射为@XmlValue
并扩展OtherClass
:
package forum809827;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;
@XmlRootElement(name="simple")
class Simple extends OtherClass {
@XmlValue
// @XmlValueExtension
// As of moxy 2.6, XmlValueExtension needs to be added for this to work
public String contents;
}
<强> OtherClass 强>
这是超级课程。在MOXy中,只要超类没有与XML元素的任何映射,子类就可以使用@XmlValue
映射字段/属性:
package forum809827;
import javax.xml.bind.annotation.XmlAttribute;
public class OtherClass {
@XmlAttribute
public String other;
}
<强>演示强>
package forum809827;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Simple.class);
Simple simple = new Simple();
simple.contents = "FOO";
simple.other = "BAR";
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(simple, System.out);
}
}
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<simple xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" other="BAR">FOO</simple>
有关将MOXy指定为JAXB提供程序的更多信息
答案 2 :(得分:0)
我可以通过将@XmlValue
更改为@XmlMixed
并将变量更改为列表来完成此工作。生成的类应如下所示。
@XmlRootElement(name="simple")
class Simple extends OtherClass {
@XmlMixed
public List<String> contents;
}
答案 3 :(得分:0)
这个问题发生在我身上,花了我一点时间。 感谢Blaise Doughan 我浏览他的博客并找到答案
你必须添加一个
带有javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
的jaxb.properties文件
在同一个包中以便使用MOXy
将moxy添加到您的maven依赖项或添加moxy jar
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.5.0</version>
</dependency>
然后全部设定 我在这里有样品你可以通过我的项目去看看 https://github.com/cicidi/HelloCCD/tree/master/Jaxb