将我们的应用程序战争从 Glassfish3 转移到 Payara Micro 部署后,JAX-RS 序列化(jersey + jackson)不再起作用。
感谢 Adam,我们解决了序列化纯集合的问题,我们现在在返回 POJO 时遇到了类似的错误:
@GET
@Produces("application/json")
public BirdyTO findAllDaBirdy() {
return getBirdy();
}
其中 BirdyTO 是一个 POJO,其中包含其他 POJO 和/或 POJOS 集合。
那个给了我们错误:
MessageBodyWriter not found for media type=application/json;charset=utf-8, type=class org.example.BirdyTO, genericType=class org.example.BirdyTO.
奇怪的是,同一应用程序中的类似接口工作正常。
知道吗?
POJO 到 JSON 的映射在 Java EE 中没有标准化。默认情况下,Glassfih 4/Payara使用MOXy将POJO映射到JSON,后者使用JAXB进行映射。见[礼萨·拉赫曼的这篇文章](https://blogs.oracle.com/theaquarium/entry/moxy_is_the_new_default)。BirdyTO可能无法被Moxy映射。
如果你想使用杰克逊,你必须:
- 禁用默认 Moxy 功能(通过将
jersey.config.server.disableMoxyJson
属性设置为true
) - 将杰克逊库添加到您的应用程序中 (
com.fasterxml.jackson.jaxrs
) - 在 JAX-RS 应用程序中打开杰克逊功能(由杰克逊库提供)
有关如何在此答案中执行此操作的更多信息:使用 GlassFish v4 自定义 JSON 封送