How I return HTTP 404 JSON/XML response in JAX-RS (Jersey) on Tomcat?
http-status-code-404, java, jersey-2.0, rest, tomcat
Solution
Your `@Produces` annotation is ignored because uncaught exceptions are processed by the jax-rs runtime using a predefined (default) `ExceptionMapper` If you want to customize the returned message in case of a specific exception you can create your own `ExceptionMapper` to handle it. In your case you need one to handle the `NotFoundException` exception and query the "accept" header for the requested type of the response:
@Provider
public class NotFoundExceptionHandler implements ExceptionMapper<NotFoundException>{
@Context
private HttpHeaders headers;
public Response toResponse(NotFoundException ex){
return Response.status(404).entity(yourMessage).type( getAcceptType()).build();
}
private String getAcceptType(){
List<MediaType> accepts = headers.getAcceptableMediaTypes();
if (accepts!=null && accepts.size() > 0) {
//choose one
}else {
//return a default one like Application/json
}
}
}
Problem
I have the following code: ``` @Path("/users/{id}") public class UserResource { @Autowired private UserDao userDao; @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public User getUser(@PathParam("id") int id) { User user = userDao.getUserById(id); if (user == null) { throw new NotFoundException(); } return user; } ``` If I request for a user that doesn't exists, like `/users/1234`, with "`Accept: application/json`", this code returns an `HTTP 404` response like one would expect, but returns `Content-Type` sets to `text/html` and a body message of html. Annotation `@Produces` is ignored. Is it a problem of code or a problem of configuration?