java rest tomcat http-status-code-404 jersey-2.0

java - ¿Cómo devuelvo la respuesta HTTP 404 JSON/XML en JAX-RS(Jersey) en Tomcat?



rest http-status-code-404 (3)

Tengo el siguiente código:

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

Si solicito un usuario que no existe, como /users/1234 , con " Accept: application/json ", este código devuelve una respuesta HTTP 404 como uno esperaría, pero devuelve conjuntos de Content-Type a text/html y un mensaje corporal de html. Annotation @Produces se ignora.

¿Es un problema de código o un problema de configuración?


Puede usar el retorno de respuesta. Ejemplo a continuación:

@GET @Path("{id}") @Produces(MediaType.APPLICATION_JSON) public Response get(@PathParam("id") Long id) { ExampleEntity exampleEntity = getExampleEntityById(id); if (exampleEntity != null) { return Response.ok(exampleEntity).build(); } return Response.status(Status.NOT_FOUND).build(); }


Su anotación @Produces se ignora porque el tiempo de ejecución jax-rs procesa las excepciones no @Produces utilizando un ExceptionMapper predefinido (predeterminado) Si desea personalizar el mensaje devuelto en caso de una excepción específica, puede crear su propio ExceptionMapper para manejarlo. En su caso, necesita uno para manejar la excepción NotFoundException y consultar el encabezado "accept" para el tipo solicitado de la respuesta:

@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 } } }


el servidor devuelve 404, ya que se espera que pase cosas de la siguiente forma

/users/{id}

pero lo estás pasando como

/users/user/{id}

qué recurso no existe en absoluto

Intente acceder al recurso como /users/1234

EDITAR:

crear una clase como

class RestResponse<T>{ private String status; private String message; private List<T> objectList; //gettrs and setters }

ahora, en caso de que desee una respuesta para el User , puede crearla de la siguiente manera

RestResponse<User> resp = new RestResponse<User>(); resp.setStatus("400"); resp.setMessage("User does not exist");

y la firma de su método de descanso sería como seguir

public RestResponse<User> getUser(@PathParam("id") int id)

mientras que en caso de respuesta exitosa puedes establecer cosas como

RestResponse<User> resp = new RestResponse<User>(); List<User> userList = new ArrayList<User>(); userList.add(user);//the user object you want to return resp.setStatus("200"); resp.setMessage("User exist"); resp.setObjectList(userList);