Balaji Krishnan Balaji Krishnan - 6 months ago 32
JSON Question

RestEasy: Could not find MessageBodyWriter for response object of type: java.util.ArrayList of media type: application/json


message: Could not find MessageBodyWriter for response object of type:
java.util.ArrayList of media type: application/json

Description: The server encountered an internal error (Could not find
MessageBodyWriter for response object of type: java.util.ArrayList of
media type: application/json) that prevented it from fulfilling this
request


@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();
}


I have got the resteasy jackson provider in the classpath.
Tried changing the return type form
ArrayList
to
List
, then wrapping it in
GenericEntity
based on resteasy response, but still getting the same issue.

Running on tomcat7.

Thanks.

Answer

finally solved it using the Gson library instead of relying on json. did not wrap in Generic Entity either. Here is the code that works

@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();
}

Had to use the exclusion strategy to avoid cyclic reference. here is the link for that:stackoverflow error during json conversion (hibernate bi-directional mapping)