使用Java处理REST Web服务中的错误

时间:2015-11-16 12:23:49

标签: java rest

我有一个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.

2 个答案:

答案 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());
    }
}

WebApplicationExceptionRuntimeException,不需要包含在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获取请求中传递的标头。