如何为休息服务中的异常返回http状态码

在我的应用程序中,根据业务场景,我有不同的层,如休息层,服务层和数据库层,我正在从服务层中抛出不同的业务异常。

但是现在,我必须将不同的HTTP代码设置为400,403,409,412 ..到REST响应。

如何根据不同的场景设置不同的HTTP状态码?

这是最可行的方式,如:方面,异常映射,或....?

由于我只能在休息层设置一次HTTP状态(参考本文),所以我无法映射到不同的HTTP代码,因为我的异常来自服务层。

我的异常类看起来像这样:

public class BusinessException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    public BusinessException(ErrorEnumeration error) {

    }
    public BusinessException(Exception e, ErrorEnumeration error) {

    }
}

这样的服务会抛出异常:

 throw new BusinessException(ErrorEnumeration.VALIDATION_FAILED);

请通过建议解决方案提供帮助


您可以使用jax-rs中定义的异常,也可以使用自己的异常。 拳头捕捉你的业务异常并将它们转换为jax-rs版本。 例如,对于404,您可以抛出javax.ws.rs.NotFoundException.

您也可以通过从javax.ws.rs.ClientErrorException扩展它们来编写自己的异常

以下是409-冲突状态异常的示例

import javax.ws.rs.ClientErrorException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;

public class ConflictException extends ClientErrorException{

    public ConflictException(Response.Status status) {
        super(Response.Status.CONFLICT); // 409
    }
}

更新

最简单可行的方法是捕获您的业务异常,并使用jax-rs异常重新引发它们。

try{
  businessService.executeBusinessRule();
}catch (BusinessException e){
  // It is better if your BusinessException has some child class to handle
  if(e.getError() == ErrorEnumeration.VALIDATION_FAILED){
    throw new BadRequestException();
  }else{
    throw new ConflictException();
  }
}

如果你使用spring,你总是可以使用aop来捕捉这些异常。

@Aspect
public class BusinessExceptionInterceptor{
@AfterThrowing(pointcut = "execution(* com.your.service.packge..* (..))", throwing = "e")
public void errorInterceptor(BusinessException e) {
   // re-throw again...
}

更新2

此外,最好定义一个新的异常,而不是重复使用具有不同状态的相同异常。 您可以定义一个新的ValidationException,它可以像这样从BusinessException扩展。

public class ValidationException extends BusinessException{

    public ValidationException() {
        super(ErrorEnumeration.VALIDATION_FAILED);
    }
}

通过使用这种方式,您仍然可以处理所有BusinessException,但更容易识别或将它们映射到Jax-rs异常。

链接地址: http://www.djcxy.com/p/45575.html

上一篇: How to return http status code for exceptions in rest services

下一篇: RS so that user sees download popup for Excel?