11

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

说明:服务器遇到内部错误(无法找到 MessageBodyWriter for response object of type: java.util.ArrayList of media type: application/json),导致它无法完成此请求

@GET
@Path("/{userName}/questions")
//@Produces("application/json")
public Response getUserQuestions(@PathParam("userName") String userName){               
    UserDAO userDAO = new UserDAO();        
    List<Question> questions = userDAO.getUserQuestionsByUserName(userName);        
    GenericEntity<List<Question>> entity = new GenericEntity<List<Question>>(questions){};      
    return Response.status(200).entity(entity).type(MediaType.APPLICATION_JSON).build();
}

我在类路径中有resteasy jackson 提供程序。尝试将返回类型表单更改ArrayListList,然后GenericEntity根据resteasy response将其包装起来,但仍然遇到同样的问题。

在tomcat7上运行。

谢谢。

4

4 回答 4

13

我通过将 resteasy-jackson-provider.jar 添加到类路径解决了这个异常参考https://bitbucket.org/arcbees/gaestudio/issue/2/need-resteasy-jackson-provider-on

于 2014-11-30T10:45:44.660 回答
6

最后使用Gson library而不是依赖json解决了它。也没有包装在通用实体中。这是有效的代码

@GET
@Path("/{userName}/questions")
public Response getUserQuestions(@PathParam("userName") String userName){               
    UserDAO userDAO = new UserDAO();        
    List<Question> questions = userDAO.getQuestionsByUserName(userName);        
    Gson gson = new GsonBuilder().setExclusionStrategies(new UserQuestionsExclStrat()).create(); //.serializeNulls()
    String json = gson.toJson(questions);
    System.out.println(json); 
    return Response.status(200).entity(json).build();
}

不得不使用排除策略来避免循环引用。这是链接:json转换期间的stackoverflow错误(休眠双向映射)

于 2013-10-01T08:36:09.220 回答
5

通过在 ArrayList 中使用的类中添加 @XMLRootElement 解决了同样的问题

于 2015-04-06T05:53:31.337 回答
0

通过添加此依赖项,我能够解决此问题。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.10.1</version>
</dependency>
于 2017-09-11T11:34:54.547 回答