我有一个REST服务,其方法使用@Produces("application/pdf")
进行了分析。
如果在服务器端发生异常,我们的逻辑会引发自定义异常,扩展RuntimeException
并且我有:
throw new CustomerException(new CustomProblem("something wrong"));
将一些东西归还给客户的最佳方式是什么,在这种情况下,客户可以看到:
Status: 500
Body: No message body writer has been found for response class CustomProblem.
答案 0 :(得分:1)
在此之前,我回答了类似的问题here。
基本上,您可以采用以下方法之一来处理异常(从Jersey documentation中提取,但也适用于RESTEasy或其他JAX-RS 2.0实现):
WebApplicationException
JAX-RS允许定义Java异常到HTTP错误响应的直接映射。通过扩展WebApplicationException
,您可以创建特定于应用程序的异常,使用状态代码和可选消息构建HTTP响应作为响应的主体。
以下异常使用404
状态代码构建HTTP响应:
public class CustomerNotFoundException extends WebApplicationException {
/**
* Create a HTTP 404 (Not Found) exception.
*/
public CustomerNotFoundException() {
super(Responses.notFound().build());
}
/**
* Create a HTTP 404 (Not Found) exception.
* @param message the String that is the entity of the 404 response.
*/
public CustomerNotFoundException(String message) {
super(Response.status(Responses.NOT_FOUND).
entity(message).type("text/plain").build());
}
}
WebApplicationException
是RuntimeException
,不需要包含在try
- catch
块中,也不需要在throws
子句中声明:< / p>
@Path("customers/{customerId}")
public Customer findCustomer(@PathParam("customerId") Long customerId) {
Customer customer = customerService.find(customerId);
if (customer == null) {
throw new CustomerNotFoundException("Customer not found with ID " + customerId);
}
return customer;
}
ExceptionMapper
s 在其他情况下,抛出WebApplicationException
的实例或扩展WebApplicationException
的类可能不合适,相反,最好将现有的异常映射到响应。
对于这种情况,可以使用自定义异常映射提供程序。提供者必须实现ExceptionMapper<E extends Throwable>
接口。例如,以下内容将JAP EntityNotFoundException
映射到HTTP 404
响应:
@Provider
public class EntityNotFoundExceptionMapper
implements ExceptionMapper<EntityNotFoundException> {
@Override
public Response toResponse(EntityNotFoundException ex) {
return Response.status(404).entity(ex.getMessage()).type("text/plain").build();
}
}
当抛出EntityNotFoundException
时,将调用EntityNotFoundExceptionMapper
实例的toResponse(E)
方法。
@Provider
注释声明该类是JAX-RS运行时感兴趣的。可以将此类添加到配置的Application
实例的类集中。
答案 1 :(得分:0)
实施https://docs.oracle.com/javaee/6/api/javax/ws/rs/ext/ExceptionMapper.html并将注释@Provider放到那里。重写toResponse()方法并返回一个JSON或有意义的响应。您还可以使用@Context获取请求中传递的标头。