如何使用自动发现在 Jersey 中启用自动 JSON 编组?

How do I enable automatic JSON marshalling in Jersey using autodiscovery?

我正在尝试创建一个生成 JSON 的非常简单的示例休息服务。我的理解是 Jersey 应该自动发现 Jackson 库(如果它们在 class 路径上)并且 JSON 编组应该自动发生。

调用GET报如下错误。我是否使用了适当的依赖项来使其工作,或者我是否遗漏了一些更基本的东西?

SEVERE: MessageBodyWriter not found for media type=application/json, type=class jsonex.Person, genericType=class jsonex.Person.

依赖关系

我正在使用 Gradle 并应用了 gretty 插件和这些依赖项:

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'
}

申请class

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());
    }
}

服务class

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

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;
    }
}

谢谢!

为了 consume/produce JSON 在 Jersey with Jackson 中,您必须在您的应用程序中注册 Jackson 功能 (JacksonFeature)。 它不像其他一些 Jersey 功能那样可以自动发现。

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

@ApplicationPath("/api")
public class MyApplication extends Application {

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

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

使用 Jackson 作为 Jersey 的 JSON 提供商的步骤在 . For more details, also check the Jersey documentation 中有完整描述。