簡體   English   中英

Jersey JSON序列化

[英]Jersey JSON serialization

我設置了一個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中查看“Servers”)。 請求

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

只要我使用MediaType.TEXT_XML就沒有錯誤,內容如下所示:

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

當我將MediaType更改為“MediaType.APPLICATION_JSON”時 ,將引發以下異常(如上所述)。 我已經注意到它取決於注釋“@XmlRootElement”但是沒有類似“JsonRootElement”的東西,並且jackson / genson API聲稱它開箱即用(由於自動注冊機制)。 你知道怎么解決它嗎?

非常感謝每一位幫助! 謝謝你

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

看一下源代碼 ,了解它的作用。

您是否嘗試將此添加到您的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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM