关于 java:如何使用自动发现在 Jersey 中启用自动 JSON 编组?
How do I enable automatic JSON marshalling in Jersey using autodiscovery?
我正在尝试创建一个生成 JSON 的非常简单的示例rest服务。我的理解是 Jersey 应该自动发现 Jackson 库(如果它们在类路径上)并且 JSON 编组应该自动发生。
调用GET时报如下错误。我是在使用适当的依赖项来使它工作还是我错过了一些更基本的东西?
|
1
|
SEVERE: MessageBodyWriter not found for media type=application/json, type=class jsonex.Person, genericType=class jsonex.Person.
|
依赖
我正在使用 Gradle 并应用了 gretty 插件和这些依赖项:
|
1
2 3 4 5 |
dependencies {
compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2+' runtime group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet', version: '2.23' runtime group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '2.7' } |
应用类
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package jsonex;
import javax.ws.rs.ApplicationPath; @ApplicationPath ("services") @Override |
服务类
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package jsonex;
import javax.ws.rs.GET; @Path("people") @GET |
POJO
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package jsonex;
public class Person { public String getFirstName() { public void setFirstName(String firstName) { public String getLastName() { public void setLastName(String lastName) { |
谢谢!
为了在 Jersey 中使用 Jackson 使用/生成 JSON,您必须在您的应用程序中注册 Jackson 功能 (它不像其他泽西岛的一些功能那样自动被发现。
将
|
1
2 3 4 5 6 7 8 9 10 |
@ApplicationPath("/api")
public class MyApplication extends Application { @Override |
|
1
2 3 4 5 6 7 |
@ApplicationPath("/api")
public class MyApplication extends ResourceConfig { public MyApplication() { |
此答案中完整描述了使用 Jackson 作为 Jersey 的 JSON 提供程序的步骤。有关更多详细信息,请查看泽西文档。
相关讨论
- "它不会像其他泽西岛的一些功能一样自动被发现。" - 不正确。正在发生的事情是,通过直接扩展
Application 类,这会使资源和提供者的"发现"无效。所以最终 OP 禁用了JerseyFeature 的自动注册。所以你明确注册它的解决方案是正确的,只是细节有点不正确:-)但是使用 ResourceConfig,你不需要注册它,因为它不会禁用自动发现 - 谢谢,这是我丢失的信息,不幸的是,如果不手动注册 JerseyFeature,我仍然无法让它工作?我现在正在使用 ResourceConfig,如果我注册 JerseyFeature,它可以正常工作,但如果我不注册,我会得到同样的错误。我想了解自动发现工作缺少什么。
-
@daver 这是你的版本。直到 2.9 或 2.10 才包含自动发现功能。无论如何,您应该使用与
jersey-container-servlet 相同的版本