除了@Produces注释之外,Jersey(JAX-RS)如何知道将POJO视为特定的mime类型?

3 java rest jax-rs jersey

我看到很多Jersey的例子看起来像这样:

public class ItemResource {

    @GET
    @Path("/items")
    @Produces({"text/xml", "application/json"})
    public List<Item> getItems() {
        List<Item> items = new ArrayList<Item>();

        Item item = new Item();
        item.setItemName("My Item Name!");
        items.add(item);

        return items;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是后来我无法解析Item,以及Jersey知道如何将Item转换为XML或JSON.我已经看到了非常基本的例子,只返回构造的HTML或XML的字符串,这对我来说更有意义,但我错过了下一步.我查看了样本,其中一个突出(json-from-jaxb样本),因为对象标有这些类型的注释:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "flight"
})
@XmlRootElement(name = "flights")
Run Code Online (Sandbox Code Playgroud)

我正在寻找一步一步涵盖这个"翻译"的教程,或者解释如何将POJO翻译为输出为特定的mime类型.谢谢!

Jan*_*sen 10

这里有两件事在起作用.首先,@ Production注释中的媒体类型用于内容协商.将客户端发送的Accept标头的值中的媒体类型与@Produces注释中的媒体类型进行比较,并选择最合适的一个.假设您的示例中是text/xml.

构建响应体时,Jersey内部尝试查找可以将Item对象转换为text/xml的MessageBodyWriter.通常程序员提供这些"映射器"类,但对于XML和JSON,Jersey已经内置了MessageBodyReaders以方便使用.

这就是为什么看起来似乎有一些魔法.

一月