2015-03-19 182 views
25

我試圖通過瀏覽周圍來創建一個Restful web服務淨和我創建了一個,但我越來越沒有找到媒體類型=應用程序/ JSON錯誤MessageBodyWriterSEVERE:MessageBodyWriter找不到media type = application/json,type = class com.jersey.jaxb.Todo,genericType = class com.jersey.jaxb.Todo

Todo類:

package com.jersey.jaxb; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 
import org.pojomatic.Pojomatic; 
import org.pojomatic.annotations.AutoProperty; 

@XmlRootElement 
@XmlType(name = "todo") 
@XmlAccessorType(XmlAccessType.FIELD) 
@AutoProperty 
public class Todo { 

    @XmlElement(name = "summary") 
    private final String summary; 

    @XmlElement(name = "description") 
    private final String description; 

    public String getSummary() { 
     return summary; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public Todo() { 
     this(new Builder());  
    } 

    public Todo(Builder builder) { 
     this.summary = builder.summary; 
     this.description = builder.description; 
    } 

    @Override 
    public boolean equals(Object o) { 
     return Pojomatic.equals(this, o); 
    } 

    @Override 
    public int hashCode() { 
     return Pojomatic.hashCode(this); 
    } 

    @Override 
    public String toString() { 
     return Pojomatic.toString(this); 
    } 

    public static class Builder { 
     private String description; 
     private String summary; 

     public Builder summary(String summary) { 
      this.summary = summary; 
      return this; 
     } 

     public Builder description(String description) { 
      this.description = description; 
      return this; 
     } 

     public Todo build() { 
      return new Todo(this); 
     } 
    } 
} 

我的資源: -

package com.jersey.jaxb; 

import javax.ws.rs.Path; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.Produces; 
import javax.ws.rs.GET; 

import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.Status; 

@Path("/todo") 
public class TodoResource { 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getTodo(){ 
     Todo todo = new Todo.Builder().description("My Todo Object").summary("Created").build(); 
     return Response.status(Status.OK).entity(todo).build(); 
    } 

} 

我的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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
<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> 
<display-name>MyFirstWebService</display-name> 
<servlet> 
    <servlet-name>Jersey REST Service</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.jersey.jaxb</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

</web-app> 

我的圖書館:

aopalliance-repackaged-2.4.0-b10.jar 
asm-debug-all-5.0.2.jar 
hk2-api-2.4.0-b10.jar 
hk2-locator-2.4.0-b10.jar 
hk2-utils-2.4.0-b10.jar 
jackson-jaxrs-json-provider-2.2.3.jar 
javassist-3.18.1-GA.jar 
javax.annotation-api-1.2.jar 
javax.inject-2.4.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.jar 
jersey-container-servlet-core.jar 
jersey-guava-2.17.jar 
jersey-media-jaxb.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 

當我運行Tomcat服務器上該應用程序並運行此: http://localhost:8080/MyFirstWebService/rest/todo

我得到的錯誤:

SEVERE: MessageBodyWriter not found for media type=application/json, type=class com.jersey.jaxb.Todo, genericType=class com.jersey.jaxb.Todo.

回答

42

您有jackson-jaxrs-json-provider這是一個開始..

但是...

該神器仍然依賴於Jacskon本身,其中包括所有這些文物

enter image description here

就是爲什麼我們使用Maven的[](所以我們不必擔心這種事情:-)。所以去找到這些。

然後,只需將包添加到web.xml,它應該工作

<param-name>jersey.config.server.provider.packages</param-name> 
<param-value> 
    com.jersey.jaxb, 
    com.fasterxml.jackson.jaxrs.json 
</param-value> 

Maven的依賴

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.2.3</version> 
</dependency> 

或者使用下面的澤西上述依賴關係的「包裝器」。它將註冊傑克遜提供商(因此我們不需要像上面那樣明確註冊)以及傑克遜例外映射器,並從版本2.17開始,爲Entity Data Filtering提供支持。

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>${jersey2.version}</version> 
</dependency> 

注:,我們不必註冊與上述任何依賴的事實,通過澤西Auto-discovery feature成爲可能。如果由於某種原因禁用了自動發現功能,您將需要明確註冊JacksonFeature

+0

。因此,應先下載所有這些jar並將其添加到我的應用程序中,然後將上面提到的這一行添加到我的web.xml中。 – 2015-03-19 23:21:36

+0

是............ – 2015-03-20 00:37:39

+0

[這是下載頁面](http://wiki.fasterxml.com/JacksonDownload)。我不需要使用截圖中最後列出的.jar文件。爲我工作! – amess 2015-06-24 20:01:33

16

解決方案可能是確保模型類具有無參數構造函數。

並添加這個依賴於你的pom.xml:

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
</dependency> 
0
  1. 更新庫JAX-RS 2.0和2.5.1新澤西州(JAX-RS-RI)僅
  2. 返回Bean對象(待辦事項)不響應,因爲雖然自動生成json或xml它響應創建問題。
3

如果您已將jersey-media-moxy依賴項添加到您的pom.xml中。確保你的實體類有默認的構造函數。 我在模型類中引入了一個paramatrized構造函數時遇到了這個問題。添加默認構造函數再次爲我工作。

+0

對於那些正在使用lombok的人來說,我正在使用'@ Builder'',你需要添加這個註解:''@ NoArgsConstructor'' ''@ AllArgsConstructor.'' – Vielinko 2017-03-21 16:50:35

4

我有同樣的問題,我解決它通過addind一個空的構造函數,我目前不使用Maven類

public SandBoxClass(){} //-> solved the issue** 

public SandBoxClass(Integer arg1, Integer arg2) { 
     this.arg1=arg1; 
     this.arg2=arg2; 
} 
相關問題