关于 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;
import javax.ws.rs.core.Application;
import java.util.Collections;
import java.util.Set;

@ApplicationPath ("services")
public class PersonApp extends Application {

    @Override
    public Set<Object> getSingletons() {
        return Collections.singleton(new PersonService());
    }
}

服务类

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;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("people")
public class PersonService {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Person getPerson() {
        Person me = new Person();
        me.setFirstName("Dave");
        me.setLastName("R");
        return me;
    }
}

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 {
    String firstName, lastName;  

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

谢谢!


为了在 Jersey 中使用 Jackson 使用/生成 JSON,您必须在您的应用程序中注册 Jackson 功能 (JacksonFeature)。 它不像其他泽西岛的一些功能那样自动被发现。

jersey-media-json-jackson 模块添加到依赖项后,在 Application / ResourceConfig 子类中注册 JacksonFeature

1
2
3
4
5
6
7
8
9
10
@ApplicationPath("/api")
public class MyApplication extends Application {

    @Override
    public Set<Class< ? >> getClasses() {
        Set<Class< ? >> classes = new HashSet<Class< ? >>();
        classes.add(JacksonFeature.class);
        return classes;
    }
}
1
2
3
4
5
6
7
@ApplicationPath("/api")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        register(JacksonFeature.class);
    }
}

此答案中完整描述了使用 Jackson 作为 Jersey 的 JSON 提供程序的步骤。有关更多详细信息,请查看泽西文档。