Jersey JSON序列化 [英] Jersey JSON serialization
问题描述
我设置了一个eclipse WebApp项目,并将Jersey和Jackson JAR放在WEB-INF / lib目录中。我想使用JSON序列化,但没有设法修复此错误:
找不到媒体类型= application / json的MessageBodyWriter ,type = class com.rest.Greeting,genericType = class com.rest.Greeting。我已经google了很多,但所有解决方案都已更新或无法解决我的问题。以下是我项目的结构:
WEB-INF / lib 文件夹包含以下JAR:
aopalliance-repackaged-2.3.0-b10.jar
asm-debug-all- 5.0.2.jar
cglib-2.2.2.jar
datafactory-0.8.jar
hk2-api-2.3.0-b10.jar
hk2-locator-2.3。 0-b10.jar
hk2-utils-2.3.0-b10.jar
jackson-annotations-2.4.0.jar
jackson-core-2.4.0.jar
jackson-databind-2.4.0.jar
jackson-jaxrs-base-2.4.0.jar
jackson-jaxrs-json-provider-2.4.0.jar
jackson-module-jaxb -annotations-2.4.0.jar
javassist-3.18.1-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.3.0-b10.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey- client.jar
jersey-common.jar
jersey-container-servlet-core.jar
jersey-container-servlet.jar
jersey-guava-2.13.jar
jersey-server.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar
web.xml :
<?xml version =1.0encoding = UTF-8 >?;
< web-app xmlns:xsi =http://www.w3.org/2001/XMLSchema-instancexmlns =http://java.sun.com/xml/ns/javaeexsi :schemaLocation =http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsdid =WebApp_IDversion =3.0 >
< display-name> Rest Test< / display-name>
< welcome-file-list>
< welcome-file> index.html< / welcome-file>
< welcome-file> index.htm< / welcome-file>
< welcome-file> index.jsp< / welcome-file>
< welcome-file> default.html< / welcome-file>
< welcome-file> default.htm< / welcome-file>
< welcome-file> default.jsp< / welcome-file>
< / welcome-file-list>
< servlet>
< servlet-name> Greeting< / servlet-name>
< servlet-class> org.glassfish.jersey.servlet.ServletContainer< / servlet-class>
< init-param>
< param-name> jersey.config.server.provider.packages< / param-name>
< param-value> com.rest< / param-value>
< / init-param>
< load-on-startup> 1< / load-on-startup>
< / servlet>
< servlet-mapping>
< servlet-name> Greeting< / servlet-name>
< url-pattern> / greet / *< / url-pattern>
< / servlet-mapping>
< / web-app>
Greeting.java :
@XmlRootElement
@Path(/ greeting)
public class Greeting {
private String greeting;
public Greeting(){
this.setGreeting(hello);
}
@GET
@Produces(MediaType.TEXT_XML)
public Greeting sayHello(){
return new Greeting();
}
public String getGreeting(){
return greeting;
}
public void setGreeting(String greeting){
this.greeting = greeting;
}
}
WebApp项目运行于嵌入式Tomcat v7服务器(在eclipse中查看Servers)。
请求:
http:// localhost:8080 / com.rest /问候/问候
只要我使用 MediaType.TEXT_XML 就没有错误,内容如下所示:
< greeting>
< greeting> hello< / greeting>
< / greeting>
当我将MediaType更改为MediaType.APPLICATION_JSON时,会出现以下异常(如上所述)被抛出。我已经注意到它取决于注释@XmlRootElement,但是没有类似JsonRootElement的东西,并且jackson / genson API声称它开箱即用(由于自动注册机制)。你知道如何解决这个问题吗?
非常感谢每一位帮助!
谢谢
golbie
您只需注册 JacksonJsonProvider
。有很多方法可以实现这一目标:
- 在web.xml中明确注册JacksonJsonProvider:
< init-param>
< param-name> jersey.config.server.provider.classnames< / param-name>
< param-value> com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider< / param-value>
< / init-param>
或
< ol start =2>
javax.ws.rs.core.Application
的类
< init-param>
< param-name> javax.ws.rs.Application< / param-name>
< param-value> com.rest.MyApplication< / param-value>
< / init-param>
然后执行应用程序类中的所有配置:
package com.rest;
import org.glassfish.jersey.server.ResourceConfig;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
公共类MyApplication扩展ResourceConfig {
public MyApplication(){
packages(com.rest);
寄存器(JacksonJsonProvider.class);
}
ResourceConfig
是一个 javax.ws.rs.Application
的子类,并为您提供了一些帮助您轻松注册的辅助方法。
或
- 使用自动注册。只需将依赖项添加到
jersey-media-json-jackson
< dependency>
< groupId> org.glassfish.jersey.media< / groupId>
< artifactId> jersey-media-json-jackson< / artifactId>
< version> 2.13< / version>
< / dependency>
但要小心。它会注册超过你需要的数量:
- JacksonJaxbJsonProvider,
- JsonParseExceptionMapper,
- JsonMappingExceptionMapper
看一下源代码看看它做了什么。
I set up an eclipse WebApp project and placed Jersey and Jackson JARs in the WEB-INF/lib directory. I want to use JSON serialization but didn't manage to fix this error:
MessageBodyWriter not found for media type=application/json, type=class com.rest.Greeting, genericType=class com.rest.Greeting. I already googled much but all the solutions are updated or don't solve my issue. Here is the structure of my project:
The WEB-INF/lib folder contains following JARs:
aopalliance-repackaged-2.3.0-b10.jar
asm-debug-all-5.0.2.jar
cglib-2.2.2.jar
datafactory-0.8.jar
hk2-api-2.3.0-b10.jar
hk2-locator-2.3.0-b10.jar
hk2-utils-2.3.0-b10.jar
jackson-annotations-2.4.0.jar
jackson-core-2.4.0.jar
jackson-databind-2.4.0.jar
jackson-jaxrs-base-2.4.0.jar
jackson-jaxrs-json-provider-2.4.0.jar
jackson-module-jaxb-annotations-2.4.0.jar
javassist-3.18.1-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.3.0-b10.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet-core.jar
jersey-container-servlet.jar
jersey-guava-2.13.jar
jersey-server.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Rest Test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Greeting</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Greeting</servlet-name>
<url-pattern>/greet/*</url-pattern>
</servlet-mapping>
</web-app>
Greeting.java:
@XmlRootElement
@Path("/greeting")
public class Greeting {
private String greeting;
public Greeting() {
this.setGreeting("hello");
}
@GET
@Produces(MediaType.TEXT_XML)
public Greeting sayHello() {
return new Greeting();
}
public String getGreeting() {
return greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
}
The WebApp project is run in an embedded Tomcat v7 server (view "Servers" in eclipse). The request:
http://localhost:8080/com.rest/greet/greeting
As long as I use MediaType.TEXT_XML there is no error and the content looks like this:
<greeting>
<greeting>hello</greeting>
</greeting>
When I change MediaType to "MediaType.APPLICATION_JSON" then the following exception (as described above) is thrown. I already noticed that it depends on the annotation "@XmlRootElement" but there is not something like "JsonRootElement" and the jackson/genson APIs claim that it works out of the box (due to the auto registration mechanism). Do you have any idea how to fix it?
Every help is very very appreciated! thank you golbie
All you need is to register JacksonJsonProvider
. There are many ways to achieve that:
- Register the JacksonJsonProvider explicitly in web.xml:
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider</param-value>
</init-param>
or
- Register your class extending
javax.ws.rs.core.Application
in the web.xml
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.rest.MyApplication</param-value>
</init-param>
and then do all the configuration in the application class:
package com.rest;
import org.glassfish.jersey.server.ResourceConfig;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("com.rest");
register(JacksonJsonProvider.class);
}
ResourceConfig
is a subclass of javax.ws.rs.Application
and gives you some helper methods that makes the registration easy.
or
- Use automatic registration. Just add dependency to
jersey-media-json-jackson
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.13</version>
</dependency>
But be careful. It will register more than you need:
- JacksonJaxbJsonProvider,
- JsonParseExceptionMapper,
- JsonMappingExceptionMapper
Take a look at the source code to see what it does.
这篇关于Jersey JSON序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!