【问题标题】:Jersey JSON serialization泽西 JSON 序列化
【发布时间】:2014-10-22 23:41:56
【问题描述】:

我建立了一个 Eclipse WebApp 项目并将 Jersey 和 Jackson JAR 放在 WEB-INF/lib 目录中。我想使用 JSON 序列化,但未能修复此错误:

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:

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

WebApp 项目在嵌入式 Tomcat v7 服务器中运行(在 eclipse 中查看“服务器”)。 请求

http://localhost:8080/com.rest/greet/greeting

只要我使用 MediaType.TEXT_XML 就没有错误,内容看起来像这样:

<greeting>
<greeting>hello</greeting>
</greeting>

当我将 MediaType 更改为 "MediaType.APPLICATION_JSON" 时,会引发以下异常(如上所述)。我已经注意到它依赖于注释“@XmlRootElement”,但没有像“JsonRootElement”这样的东西,jackson/genson API 声称它可以开箱即用(由于自动注册机制)。你知道如何解决它吗?

非常感谢您的每一次帮助!

【问题讨论】:

    标签: java jersey jackson tomcat7


    【解决方案1】:

    您只需注册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>
    

    1. 在 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;
    
    public class MyApplication extends ResourceConfig {
    
        public MyApplication() {
            packages("com.rest");
            register(JacksonJsonProvider.class);
        }
    

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

    看看source code 看看它的作用。

    【讨论】:

    • @golbie 不客气。我很高兴能帮上忙。您选择了哪种解决方案(1、2 或 3)?
    • 嗨,由于这是一个单一的应用程序,我决定使用 init-param 节点。谢谢。
    • 添加对 jersey-media-json-jackson 的依赖帮助了我,SO 页面和博客文章建议的许多非工作解决方案。我的 Jersey 版本是 2.22.1。
    • 我使用了解决方案 n.2。无论如何 jersey-media-json-jackson 是导入 JacksonJsonProvider.class 所必需的
    【解决方案2】:

    您是否尝试将其添加到您的 web.xml 中?

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    

    我相信本教程展示了您正在尝试做什么 http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/

    另一个来自 mkyong http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

    【讨论】:

    • @mendieta:Lukasz 是对的,这是没用的事情之一。
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 2015-03-10
    • 2011-10-14
    • 2015-01-05
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多