我正在尝试创建一个生成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;
}
}
谢谢!
答案 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。