【发布时间】: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服务器上,而客户端明显没有收到响应。
【问题讨论】:
-
@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 & add objects to the json array-- return Response.status(200).entity(""+resp_jarray ).build(); }