我如何使用Jersey JSON POJO支持?
我有一个对象,我想用JSON作为RESTful资源提供服务。 我开启了Jersey的JSON POJO支持(在web.xml中):
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
但是,当我尝试访问资源时,出现以下异常:
SEVERE: A message body writer for Java type, class com.example.MyDto, and MIME media type, application/json, was not found
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException
...
我试图服务的类并不复杂,只有一些公共final字段和一个构造函数来设置它们。 这些字段都是字符串,基本类,类似于这个的类,或者它们的列表(我尝试使用普通列表而不是泛型列表<T> s,但是无效)。 有谁知道什么给了? 谢谢!
Java EE 6
泽西岛1.1.5
GlassFish 3.0.1
Jersey-json有一个JAXB实现。 你得到这个异常的原因是因为你没有注册提供者,或者更确切地说是一个MessageBodyWriter。 您需要在您的提供商中注册适当的上下文:
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private final static String ENTITY_PACKAGE = "package.goes.here";
private final static JAXBContext context;
static {
try {
context = new JAXBContextAdapter(new JSONJAXBContext(JSONConfiguration.mapped().rootUnwrapping(false).build(), ENTITY_PACKAGE));
} catch (final JAXBException ex) {
throw new IllegalStateException("Could not resolve JAXBContext.", ex);
}
}
public JAXBContext getContext(final Class<?> type) {
try {
if (type.getPackage().getName().contains(ENTITY_PACKAGE)) {
return context;
}
} catch (final Exception ex) {
// trap, just return null
}
return null;
}
public static final class JAXBContextAdapter extends JAXBContext {
private final JAXBContext context;
public JAXBContextAdapter(final JAXBContext context) {
this.context = context;
}
@Override
public Marshaller createMarshaller() {
Marshaller marshaller = null;
try {
marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
} catch (final PropertyException pe) {
return marshaller;
} catch (final JAXBException jbe) {
return null;
}
return marshaller;
}
@Override
public Unmarshaller createUnmarshaller() throws JAXBException {
final Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setEventHandler(new DefaultValidationEventHandler());
return unmarshaller;
}
@Override
public Validator createValidator() throws JAXBException {
return context.createValidator();
}
}
}
这将在提供的包名称中查找@XmlRegistry
,该包名称是包含@XmlRootElement
注释的POJO的包。
@XmlRootElement
public class Person {
private String firstName;
//getters and setters, etc.
}
然后在同一个包中创建一个ObjectFactory:
@XmlRegistry
public class ObjectFactory {
public Person createNewPerson() {
return new Person();
}
}
在注册@Provider
,Jersey应该为您的资源中的编组提供便利:
@GET
@Consumes(MediaType.APPLICATION_JSON)
public Response doWork(Person person) {
// do work
return Response.ok().build();
}
如果您想使用JAXB注释,请使用@XmlRootElement
(请参阅其他答案)。
但是,如果您更喜欢纯POJO映射,则必须执行以下操作(不幸的是,它不是用docs编写的):
com.sun.jersey.config.property.packages
初始参数,请将org.codehaus.jackson.jaxrs
添加到列表中。 这将包括Jersey的扫描列表中的JSON提供程序。 这对我来说 - 泽西岛2.3.1
在web.xml文件中:
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value><my webapp packages>;org.codehaus.jackson.jaxrs</param-value>
</init-param>
</servlet>
在pom.xml文件中:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.3.1</version>
</dependency>
链接地址: http://www.djcxy.com/p/7955.html
上一篇: How do I use the Jersey JSON POJO support?
下一篇: what is the exact mimetype for doc and docx while using ng2FileSelect