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);