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

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

public class ItemResource { @GET @Path("/items") @Produces({"text/xml", "application/json"}) public List getItems() { List items = new ArrayList(); Item item = new Item(); item.setItemName("My Item Name!"); items.add(item); return items; } } 

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

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "flight" }) @XmlRootElement(name = "flights") 

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

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

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

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

一月