Jackson:JAX-RS应用程序中的数组列表包装器

时间:2015-04-14 12:26:18

标签: java xml rest jackson jax-rs

以下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>

1 个答案:

答案 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"}, ...]
}