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

Posted

技术标签:

【中文标题】未找到 Java 类 java.util.ArrayList、Java 类型类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器【英文标题】:A message body writer for Java class java.util.ArrayList, and Java type class java.util.ArrayList, and MIME media type application/json was not found 【发布时间】:2016-10-01 07:18:32 【问题描述】:

我是使用 jersy 实现 rest api 的新手

我在调用产品服务时收到以下错误。

 com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type class java.util.ArrayList, and MIME media type application/json was not found.

这是我的代码:

@GET
@Path("/products")
@Produces(MediaType.APPLICATION_JSON)
public Response productSearch(@QueryParam("name") String name)

   List<Product> products = new ArrayList<>();
   products.add(new Product("PRDNAME", "PRDCOST", "PRDMODEL"));
   return Response.ok( products).build();

我也试过这个:

@GET
@Path("/products")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> productSearch(@QueryParam("name") String name)

   List<Product> products = new ArrayList<>();
   products.add(new Product("PRDNAME", "PRDCOST", "PRDMODEL"));
   return products;

以下是我的环境设置:

雄猫 8, 球衣库:jersey-bundle-1.19.1, 不使用 maven

web.xml:

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>org.test.rest</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

我也尝试使用以下初始化参数:

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

我尝试返回 GenericEntity,但遇到了同样的问题。

return Response.ok().entity(new GenericEntity<List<Product>>(products) ).build();

我也尝试过使用

jersey-core-1.8.jar jersey-json-1.8.jar jersey-server-1.8.jar

而不是 jersey-bundle-1.19.1

我返回字符串时没有任何问题。 我了解,我缺少 json 媒体类型依赖项,但无法弄清楚。

这个错误发生在tomcat服务器上,而客户端明显没有收到响应。

【问题讨论】:

看看这个:***.com/questions/5392413/… @LeTex 我已经尝试过使用问题中提到的 GenericEntity,但我发现 JaxbContentResolver 很难理解。 @jarrod-roberson 你提到的那个,把它标记为重复,是不一样的。这是关于期望 xml 消息的客户端中的类似错误。我的错误发生在服务器无法理解 JSON 和 arraylist 媒体类型并且客户端没有收到响应。 所有A message body writer for Java type ... , was not found. 错误消息的发生原因完全相同,无论具体情况如何。 @jarrod-roberson 提供的链接修复了我不能(或不知道如何)在服务器端使用它的客户端代码。感谢您的时间。 --- 这可能对某人有所帮助 - 虽然我没有解决最初的问题,但我现在设法使用下面的代码完成了我的工作:@GET @Path("/products") @Produces(MediaType.APPLICATION_JSON) public Response productSearch(@QueryParam("name") String name) JSONArray resp_jarray = new JSONArray(); // -- fetch data &amp; add objects to the json array-- return Response.status(200).entity(""+resp_jarray ).build(); 【参考方案1】:

也许你忘了添加

@XmlRootElement

模型类定义之上的注释。 对于您的“产品”模型,我想它会类似于

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Product
....

我有一个类似的异常,这为我解决了。

【讨论】:

以上是关于未找到 Java 类 java.util.ArrayList、Java 类型类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器的主要内容,如果未能解决你的问题,请参考以下文章

java类定义未找到异常

H2数据库用户定义的java函数类未找到

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

未找到类型返回值的转换器:类 java.util.HashMap

Java Jersey Rest:未找到提供程序类。 (访问 URL 时出现 404 错误)

java.lang.RuntimeException:无法实例化接收器(未找到类)