以下REST API列表服务返回消息列表。使用Jackson XML序列化程序,使用<ArrayList>
warapper元素生成响应列表。但是,我需要一个带有多个包装元素<Messages>
的JAXB样式输出。是否有可能在不需要创建包装器Messages
类的情况下实现此目的。
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response getMessages() throws Exception {
List<Messages> messages = new ArrayList<Messages>();
messages.add(new Message("abc"));
messages.add(new Message("xyz"));
messages.add(new Message("pqr"));
return Response.status(200).entity(messages).build();
}
public class Message {
@JacksonXmlProperty
private String msg;
public String getMsg() {
return msg;
}
public void setName(String msg) {
this.msg = msg;
}
public Message(String msg) {
this.msg = msg;
}
}
观察输出:
<ArrayList>
<item>
<Msg>abc</Msg>
</item>
<item>
<Msg>xyz</Msg>
</item>
<item>
<Msg>pqr</Msg>
</item>
</ArrayList>
预期产出:
<Messages>
<Message>
<Msg>abc</Msg>
</Message>
<Message>
<Msg>xyz</Msg>
</Message>
<Message>
<Msg>pqr</Msg>
</Message>
</Messages>
答案 0 :(得分:1)
没有JAX-RS 1.x解决方案,但像RESTEasy这样的框架为此提供了自己的注释:
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Wrapped(element = "Messages")
public Response getMessages() throws Exception {
您还可以创建自己的包装器数据结构。如果您需要XML和JSON的单独结构,您可能希望拆分方法。一个用于生成JSON,一个用于XML。
对齐JSON和XML有点棘手,只有维护一种方法才能克服一些限制。
另一种选择可能是:
@XmlRootElement(name = "Messags")
public class Messages {
@XmlElement(name="Message");
@JsonProperty("Messages")
List<Message> messages = new ArrayList<>;
}
这会导致: XML:
<Messages>
<Message>
<Msg>abc</Msg>
</Message>
<Message>
<Msg>xyz</Msg>
</Message>
<Message>
<Msg>pqr</Msg>
</Message>
</Messages>
JSON:
{
"Messages": [{"Msg":"abc"}, ...]
}