我使用Jersey来实现我的REST API,我有以下服务:
@Path("discoverytopology")
public class DiscoveryTopology {
@GET
@Produces("application/xml")
public List<Definition> getDefinitionList() {
List<Definition> definitions = db.getDefinitions();
return definitions;
}
}
Definition
类由XML注释注释,XML中的响应包含许多定义,如:
<defition body>
<defition body>
....
但是我想要这样的东西,我需要为XML中的每个定义提供一个ID,就像:
<DefinitionList>
<definition id=1>
<definition body>
</definition>
<definition id=2>
<definition body>
</definition>
............
</DefinitionsList>
我怎么做?
答案 0 :(得分:0)
您需要一个对象,该对象将在一个将使用@XMLRootElelement
注释的类中表示您的DefinitionList,并且它必须包含Definition
的列表
JAX-B无法创建<DefinitionList>
元素,除非它知道它存在。
然后,您需要正确注释Definition
类,以便您的<definition>
元素看起来像您想要的,属性与属性等。
我不确定你的<definition body>
withtin <definition id="1">
是否只是一个意味着“定义体”的填充物,但如果没有,那么在同一个内容中有2个具有不同定义的元素可能会变得棘手架构。不确定它是否是正确的XML。
答案 1 :(得分:0)
创建一个注释如下的DefinitionWrapper
类:
@XmlRootElement(name = "DefinitionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class DefinitionWrapper {
@XmlElement(name = "definition")
private List<Definition> definitions;
public List<Definition> getDefinitions() {
return definitions;
}
public void setDefinitions(List<Definition> definitions) {
this.definitions = definitions;
}
}
确保Definition
类注释如下:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Definition implements Serializable {
@XmlAttribute
private Integer id;
// Other fields
// Getters and setters
}
并更改您的端点方法以返回DefinitionWrapper
:
@Path("discoverytopology")
public class DiscoveryTopology {
@GET
@Produces("application/xml")
public DefinitionWrapper getDefinitionList() {
List<Definition> definitions = db.getDefinitions();
DefinitionWrapper definitionWrapper = new DefinitionWrapper;
definitionWrapper.setDefinitions(definitions);
return definitionWrapper;
}
}
当封送到XML时,结果将是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DefinitionList>
<definition id="1"/>
<definition id="2"/>
<definition id="3"/>
</DefinitionList>
您的id
课程中可能需要除Definition
之外的其他字段。例如,考虑一下,您需要一个description
字段,它应该被封送为XML元素。
要实现此功能,请使用@XmlElement
为您的字段添加注释,如下所示:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Definition implements Serializable {
@XmlAttribute
private Integer id;
@XmlElement
private String description;
// Getters and setters
}
当封送到XML时,结果将是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DefinitionList>
<definition id="1">
<text>This is a description</text>
</definition>
<definition id="2">
<text>This is a description</text>
</definition>
<definition id="3">
<text>This is a description</text>
</definition>
</DefinitionList>
您可以使用@XmlValue
注释字段:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Definition implements Serializable {
@XmlAttribute
private Integer id;
@XmlValue
private String value;
// Getters and setters
}
当您的对象被封送到XML时,结果如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DefinitionList>
<definition id="1">This is the value</definition>
<definition id="2">This is the value</definition>
<definition id="3">This is the value</definition>
</DefinitionList>
但是,每个类只允许使用@XmlValue
注释一个字段。如果某个类有任何使用@XmlElement
注释的字段,则不能使用@XmlValue
注释任何字段。