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

时间:2017-03-26 07:32:42

标签: java jackson jersey-2.0

我正在尝试创建一个生成JSON的非常简单的示例休息服务。我的理解是Jersey应该自动发现Jackson库(如果他们在类路径上)并且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'
}

申请类

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

服务类

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

谢谢!

1 个答案:

答案 0 :(得分:2)

为了在Jackson中使用杰克逊消费/生成JSON,您必须在应用程序中注册Jackson功能(JacksonFeature)。 它不像其他一些泽西特色那样可自动发现。

jersey-media-json-jackson模块添加到您的依赖项后,在JacksonFeature / Application子类中注册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);
    }
}

answer中详细描述了将Jackson用作Jersey的JSON提供程序的步骤。有关详细信息,请查看泽西岛documentation