Jersey JSON序列化 [英] Jersey JSON serialization

查看:97
本文介绍了Jersey JSON序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我设置了一个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 。有很多方法可以实现这一目标:


  1. 在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>
  • 在web.xml中注册扩展 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 的子类,并为您提供了一些帮助您轻松注册的辅助方法。




    1. 使用自动注册。只需将依赖项添加到 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:

    1. 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

    1. 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

    1. 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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆