Sun*_* Rk 6 java rest cxf http
在我的应用程序中,我有不同的层,如休息层,服务层和数据库层,根据业务场景我从服务层投掷不同的业务异常.
但是现在,我必须为REST响应设置不同的HTTP代码,如400,403,409,412 ..
如何根据不同的场景设置不同的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) {
}
}
Run Code Online (Sandbox Code Playgroud)
并且将从服务抛出异常,如下所示:
throw new BusinessException(ErrorEnumeration.VALIDATION_FAILED);
Run Code Online (Sandbox Code Playgroud)
建议解决方案请帮助
您可以使用jax-rs中定义的异常,也可以使用自己的异常.Fist捕获您的业务异常并将其转换为jax-rs版本.例如,对于404,你可以扔掉javax.ws.rs.NotFoundException.
您也可以通过扩展它们来编写自己的异常 javax.ws.rs.ClientErrorException
以下是409-Conflict状态异常的示例
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
}
}
Run Code Online (Sandbox Code Playgroud)
最简单可行的方法是捕获业务异常并使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你使用spring,你总是可以使用aop捕获这些异常.
@Aspect
public class BusinessExceptionInterceptor{
@AfterThrowing(pointcut = "execution(* com.your.service.packge..* (..))", throwing = "e")
public void errorInterceptor(BusinessException e) {
// re-throw again...
}
Run Code Online (Sandbox Code Playgroud)
此外,最好定义一个新的异常,而不是重复使用不同状态的相同异常.您可以定义一个新的ValidationException,它从BusinessException扩展,如下所示.
public class ValidationException extends BusinessException{
public ValidationException() {
super(ErrorEnumeration.VALIDATION_FAILED);
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用这种方式,您仍然可以处理所有BusinessException,但更容易识别或将它们映射到Jax-rs异常.
| 归档时间: |
|
| 查看次数: |
22026 次 |
| 最近记录: |