我有以下代码:
@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-Type到text/html和html正文消息。注释将@Produces被忽略。
/users/1234
Accept: application/json
HTTP 404
Content-Type
text/html
@Produces
是代码问题还是配置问题?
你@Produces因未捕获的异常是由JAX- RS处理注释被忽略使用预定义(默认)运行时ExceptionMapper如果您希望自定义返回的消息在一个特定的异常的情况下,你可以创建自己ExceptionMapper来处理它。在您的情况下,您需要一个人来处理NotFoundException异常并在“ accept”标头中查询所请求的响应类型:
ExceptionMapper
NotFoundException
@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 } } }