gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:05:19 24 4
gpt4 key购买 nike

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

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

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

哪个是最可行的方式,比如:方面、异常映射器,还是......?

因为我只能在休息层设置一次 HTTP 状态 ( referred this ),我无法映射到不同的 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-Conflict 状态异常的例子

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

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

public class ValidationException extends BusinessException{

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

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

关于java - 如何为休息服务中的异常返回http状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30996740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com