编辑:我本来是从我的问题中遗漏了一个重要的细节-返回将要编组的Java对象的服务方法将返回接口类型(Foo
)而不是类实现类型(FooImpl
)。
我有一个带有JAX-B批注的简单Java类,用于一些元素和属性:
@XmlRootElement(name = "foo")
public class FooImpl {
private String id;
private String name;
@XmlElement
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
@XmlAttribute
public String getId() {
return Id;
}
public void setId(final String id) {
this.id = id;
}
}
编辑:FooImpl类具有名为
Foo
的接口:public interface Foo {
public String getName();
public void setName(final String name);
public String getId();
public void setId(final String id);
}
当我有一个返回
Foo
的服务方法时,我得到了我期望的结果:<foo id="abc123">
<name>bar</name>
</foo>
但是我还有另一个包含
List<Foo>
的类,当将其编组时,foo
的XML元素不包含其id
属性!<foos>
<foo>
<name>bar1</name>
</foo>
<foo>
<name>bar2</name>
</foo>
</foos>
包含列表的类如下所示:
@XmlRootElement(name = "foos")
public class Foos {
private List<Foo> foos;
@XmlElement(name = "foo")
public List<Foo> getFoos() {
return foos;
}
public void setFoos(List<Foo> foos) {
this.foos = foos;
}
}
我碰巧将MOXy用作我的JAX-B实现,但我认为这并不重要。
最佳答案
注意:我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。
由于您拥有一个类型为接口的属性,因此需要在@XmlElement
注释上指定实现类型:
@XmlElement(name = "foo", type=FooImpl.class)
public List<Foo> getFoos() {
return foos;
}
下面是一个完整的示例:
os
package forum9137171;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "foos")
public class Foos {
private List<Foo> foos;
@XmlElement(name = "foo", type=FooImpl.class)
public List<Foo> getFoos() {
return foos;
}
public void setFoos(List<Foo> foos) {
this.foos = foos;
}
}
oo
package forum9137171;
public interface Foo {
public String getName();
public void setName(final String name);
public String getId();
public void setId(final String id);
}
FoomImpl
package forum9137171;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "foo")
public class FooImpl implements Foo {
private String id;
private String name;
@XmlElement
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
@XmlAttribute
public String getId() {
return id;
}
public void setId(final String id) {
this.id = id;
}
}
演示版
package forum9137171;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foos.class);
System.out.println(jc);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum9137171/input.xml");
Foos foos = (Foos) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(foos, System.out);
}
}
输入输出
org.eclipse.persistence.jaxb.JAXBContext@16a786
<?xml version="1.0" encoding="UTF-8"?>
<foos>
<foo id="abc123">
<name>bar1</name>
</foo>
<foo id="def456">
<name>bar2</name>
</foo>
</foos>
想要查询更多的信息
http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html
关于java - JAX-B:子元素上缺少XML属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9137171/