SEVERE:找不到媒体types= application / json的MessageBodyWriter,type = class com.jersey.jaxb.Todo,genericType = class com.jersey.jaxb.Todo

我想通过在网上冲浪创build一个Restful Web服务,我创build了一个,但我得到一个MessageBodyWriter未find媒体types=应用程序/ JSON错误

我的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找不到media type = application / json,type = class com.jersey.jaxb.Todo,genericType = class com.jersey.jaxb.Todo。

你有jackson-jaxrs-json-provider这是一个开始..

但…

那个神器依然依赖于Jacskon本身,它包括了所有这些神器

在这里输入图像描述

这就是为什么我们使用Maven [ 1 ] (所以我们不必担心这种事情:-)。 所以去find这些。

然后,只需将该包添加到web.xml,它应该工作

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

1. Maven依赖

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

或者使用下面的泽西“包装”为上述依赖。 它将注册jackson提供者(所以我们不需要像上面那样明确地注册)和jackson例外映射器,并从版本2.17开始,为实体数据过滤提供支持。

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

注意:通过Jersey的自动发现function ,我们无需注册任何具有上述依赖关系的事实。 如果我们由于某种原因禁用自动发现,您将需要显式注册JacksonFeature

解决scheme可能是确保模型类具有无参数构造函数。

在你的pom.XML上添加这个依赖:

 <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-moxy</artifactId> </dependency> 

如果您已经将jersey-media-moxy依赖项添加到您的pom.xml中。 确保你的实体类有默认的构造函数。 当我在模型类中引入了一个paramatrized构造函数时,我得到了这个问题。 添加默认的构造函数再次为我工作。

我有同样的问题,我通过addind一个空的构造函数解决了类

 public SandBoxClass(){} //-> solved the issue** public SandBoxClass(Integer arg1, Integer arg2) { this.arg1=arg1; this.arg2=arg2; } 
  1. 仅更新库Jax-RS 2.0和Jersey 2.5.1(JAX-RS-RI)
  2. 返回Bean对象(todo)不响应,因为当自动生成json或xml它响应创build问题。