严重:找不到媒体类型 = 应用程序/json、类型 = 类 com.jersey.jaxb.Todo、通用类型 = 类 com.jersey.jaxb.Todo 的 MessageBodyWriter

Posted

技术标签:

【中文标题】严重:找不到媒体类型 = 应用程序/json、类型 = 类 com.jersey.jaxb.Todo、通用类型 = 类 com.jersey.jaxb.Todo 的 MessageBodyWriter【英文标题】:SEVERE: MessageBodyWriter not found for media type=application/json, type=class com.jersey.jaxb.Todo, genericType=class com.jersey.jaxb.Todo 【发布时间】:2015-05-22 02:01:08 【问题描述】:

我正在尝试创建一个 RESTful Web 服务,我创建了一个,但我得到了一个

找不到媒体类型=应用程序/json错误的MessageBodyWriter

我的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

我得到错误:

严重:找不到媒体类型 = 应用程序/json 的 MessageBodyWriter, type=class com.jersey.jaxb.Todo,genericType=class com.jersey.jaxb.Todo.

【问题讨论】:

如果您不使用 maven ***.com/questions/30423776/…,这确实帮助我解决了这个问题 【参考方案1】:

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

但是...

该工件仍然依赖于 Jacskon 本身,其中包括所有这些工件

这就是我们使用 Maven[1] 的原因(所以我们不必担心这种事情 :-)。所以去找这些。

然后只需将包添加到 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>

或者对上述依赖项使用下面的 Jersey “包装器”。它将注册 Jackson 提供程序(因此我们不需要像上面那样显式注册),​​并且 Jackson 异常映射器,从 2.17 版本开始,提供对 Entity Data Filtering 的支持。

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

注意:我们不必注册任何具有上述依赖项的东西,这可以通过 Jersey 的Auto-discovery feature 实现。如果我们出于某种原因禁用自动发现,您将需要显式注册JacksonFeature

【讨论】:

我目前没有使用 Maven。所以应该先下载所有这些 jar 并将其添加到我的应用程序中,然后将您上面提到的这一行添加到我的 web.xml 中。 Here's the download page。我不需要使用屏幕截图中最后列出的 .jar 文件。为我工作! 从头开始。我确实需要“jackson-module-jaxb-annotations-2.2.3.jar”来将 JSON 转换为 XML。 Thiw 可以解决问题:org.glassfish.jersey.mediajersey-media-json-jackson$ jersey.version 提供程序包com.jersey.jaxb 好像有问题,我认为不存在。【参考方案2】:

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

并在您的 pom.XML 中添加此依赖项:

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

【讨论】:

【参考方案3】:

我遇到了同样的问题,我通过在类中添加一个空的构造函数来解决它

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

public SandBoxClass(Integer arg1, Integer arg2) 
        this.arg1=arg1;
        this.arg2=arg2;

【讨论】:

【参考方案4】:

如果您已经在 pom.xml 中添加了 jersey-media-moxy 依赖项。确保您的实体类具有默认构造函数。 当我在模型类中引入参数化构造函数时,我遇到了这个问题。再次添加默认构造函数对我有用。

【讨论】:

对于那些像我一样使用lombok并且使用@Builder的人,您需要添加此注释:@NoArgsConstructor@AllArgsConstructor.【参考方案5】:

对我来说,注册JacksonFeature

public class App extends ResourceConfig 
   public App() 
       packages("info.ernestas.simplerest");
       register(new JacksonFeature()); // This magical line helped
   

【讨论】:

【参考方案6】:
    仅更新库 Jax-RS 2.0 和 Jersey 2.5.1(JAX-RS-RI) 返回 Bean 对象(待办事项)不响应,因为在自动生成 json 或 xml 时它会响应创建问题。

【讨论】:

以上是关于严重:找不到媒体类型 = 应用程序/json、类型 = 类 com.jersey.jaxb.Todo、通用类型 = 类 com.jersey.jaxb.Todo 的 MessageBodyWriter的主要内容,如果未能解决你的问题,请参考以下文章

泽西岛错误:找不到媒体类型 = 应用程序/json 的 MessageBodyReader

泽西岛:找不到媒体类型 = 应用程序/json、类型 = 类 org.codehaus.jackson.node.ObjectNode 的 MessageBodyWriter?

找不到类型的响应对象的 MessageBodyWriter:媒体类型的 java.util.LinkedHashMap:application/json

找不到 MessageBodyWriter 类型的响应对象:com.sun.jersey.api.json.JSONWithPadding 媒体类型:application/x-javascript

找不到 Java 类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器

找不到媒体类型格式化程序