Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为rest服务中的异常返回http状态代码_Java_Rest_Http_Cxf - Fatal编程技术网

Java 如何为rest服务中的异常返回http状态代码

Java 如何为rest服务中的异常返回http状态代码,java,rest,http,cxf,Java,Rest,Http,Cxf,在我的应用程序中,我有不同的层,如rest层、服务层和DB层,根据业务场景,我从服务层处理不同的业务异常 但是现在,我必须设置不同的HTTP代码,比如400403409412。。休息一下 如何根据不同的场景设置不同的HTTP状态码 最可行的方法是:方面、异常映射器还是 因为我只能在rest层设置一次HTTP状态( ),我无法映射到不同的HTTP代码,因为我的异常来自服务层 我的异常类如下所示: public class BusinessException extends RuntimeExcep

在我的应用程序中,我有不同的层,如rest层、服务层和DB层,根据业务场景,我从服务层处理不同的业务异常

但是现在,我必须设置不同的HTTP代码,比如400403409412。。休息一下

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

最可行的方法是:方面、异常映射器还是

因为我只能在rest层设置一次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);
异常将从服务中抛出,如下所示:

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.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异常。

Hi,感谢您的快速回复:)我已经更新了这个问题。在我的“BusinessException”类中再添加一个方法是否合适,如下所示?public BusinessException(ErrorEnumeration error,Response.Status httpStatus){},这样我就可以在抛出itsef的同时发送状态了。不,不好。您的业务层不应该知道使用它的是哪一层。您必须详细说明您的异常,然后正确处理它们,最后以状态代码的形式重新显示它们。哦,好的,但如果我想按照您所说的重新抛出,我必须编写catch或新的异常类(参考您的答案)。问题是,根据业务场景,我有大约35种不同的枚举,我无法捕获35个用于重新映射或创建新类的异常,这也是不推荐的。在这种情况下,我如何继续?是的,这将是一个问题:)。只需使用
businessException
exception捕捉它们。然后编写一个根据枚举生成异常的实用程序。你可以用aop捕捉它们。这样,您就不需要编写
try…catch
语句。但是,如果您还没有集成aop,那么您需要集成aop
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();
  }
}