一尘不染

如何在Tomcat上的JAX-RS(Jersey)中返回HTTP 404 JSON / XML响应?

tomcat

我有以下代码:

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

如果我请求一个不存在的用户(如/users/1234带有“ Accept: application/json”的),则此代码将返回一个HTTP 404期望的响应,但返回Content-Typetext/html和html正文消息。注释将@Produces被忽略。

是代码问题还是配置问题?


阅读 431

收藏
2020-06-16

共1个答案

一尘不染

@Produces因未捕获的异常是由JAX-
RS处理注释被忽略使用预定义(默认)运行时ExceptionMapper如果您希望自定义返回的消息在一个特定的异常的情况下,你可以创建自己ExceptionMapper来处理它。在您的情况下,您需要一个人来处理NotFoundException异常并在“
accept”标头中查询所请求的响应类型:

@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
         }
    }
}
2020-06-16