我想根据响应对象错误动态返回HTTPStatus代码,如400,400,404等。 我被提到了这个问题 - Programmatically change http response status using spring 3 restful,但没有帮助。
我有一个带有$size = 6;
$times = 0;
foreach($itemsFromDatabase as $val){
if(($size * $times++) == 12){
$size = ($size == 6) ? 4 : 6;
$times = 1;
}
echo '<li class="col-md-'.$size.'">'.$val['img'].'</li>';
}
方法
@ExceptionHandler
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseEntity<?> handleException(CustomException e) {
return new ResponseEntity<MyErrorResponse>(
new MyErrorResponse(e.getCode(), ExceptionUtility.getMessage(e.getMessage())),
ExceptionUtility.getHttpCode(e.getCode()));
}
是一个类,其中我使用了上面使用的两种方法(ExceptionUtility
和getMessage
)。
getCode
我不想检查条件并相应地返回响应代码,还有其他更好的方法吗?
答案 0 :(得分:1)
您的@ExceptionHandler
方法需要做两件事:
(i)具有一个HttpServletResponse
参数,因此您可以设置响应状态代码;和(ii)没有@ResponseStatus
注释。
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseEntity<?> handleException(HttpServletResponse resp, CustomException e) {
resp.setStatus(ExceptionUtility.getHttpCode(e.getCode()).value());
return new ResponseEntity<MyErrorResponse>(
new MyErrorResponse(e.getCode(), ExceptionUtility.getMessage(e.getMessage())),
ExceptionUtility.getHttpCode(e.getCode()));
}
我已经使用这种@ExceptionHandler
来处理NestedServletException
,这是Spring有时创建的一个异常,用于包装需要处理的“实际”异常(下面的代码)。请注意,@ExceptionHandler
方法可以同时将请求和响应对象作为参数。
@ExceptionHandler(NestedServletException.class)
@ResponseBody
public Object handleNestedServletException(HttpServletRequest req, HttpServletResponse resp,
NestedServletException ex) {
Throwable cause = ex.getCause();
if (cause instanceof MyBusinessLogicException) {
resp.setStatus(HttpStatus.UNPROCESSABLE_ENTITY.value());
return createStructureForMyBusinessLogicException((MyBusinessLogicException) cause);
}
if (cause instanceof AuthenticationException) {
resp.setStatus(HttpStatus.UNAUTHORIZED.value());
} else if (cause instanceof AccessDeniedException) {
resp.setStatus(HttpStatus.FORBIDDEN.value());
} else {
resp.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
}
return createStructureForOtherErrors(req, cause.getMessage(), resp.getStatus());
}
答案 1 :(得分:1)
第一种方法:
您可以在 customException 类中使用 HTTPStatus 字段。例如
class CustomException {
HttpStatus httpStatus;
....other fields
}
您可以抛出如下错误:
throw new CustomException(otherField , HttpStatus.CREATED);
在您的异常处理程序中,您可以执行以下操作:
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseEntity<?> handleException(CustomException e) {
return new ResponseEntity<MyErrorResponse>(
new MyErrorResponse(e.getCode(), ExceptionUtility.getMessage(e.getMessage())),
e.getHttpStatus());
}
其中,e.getHttpStatus() 返回 HTTPStatus。
第二种方法:
或者你可以像这样为你的代码声明枚举:
public enum ErrorCode {
MyErrorCode(HttpStatus.OK);
HttpStatus status;
//getter for httpstatus
}
然后您可以将异常处理程序修改为
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseEntity<?> handleException(CustomException e) {
return new ResponseEntity<MyErrorResponse>(
new MyErrorResponse(e.getCode(), ExceptionUtility.getMessage(e.getMessage())),
e.getHttpStatus());
}
e.getHttpStatus() 再次是对枚举的方法调用,但为此您必须在自定义异常中更改代码字段类型,如果您也不想这样做,那么您可以编写一个辅助方法在枚举中类似:
HttpStatus getHttpStatus(String code) {
return ErrorCode.valueOf(code.toUpperCase()).getHttpStatus();
}
对不起,我错过了上述方法中的空指针异常,但您可以根据需要修改它,只是提供一个想法。 :)
答案 2 :(得分:0)
您需要为不同的Exception定义不同的Exception处理程序,然后使用@ResponseStatus
,如下所示:
@ResponseStatus(HttpStatus.UNAUTHORIZED)
@ExceptionHandler({ UnAuthorizedException.class })
public @ResponseBody ExceptionResponse unAuthorizedRequestException(final Exception exception) {
return response;
}
@ResponseStatus(HttpStatus.CONFLICT)
@ExceptionHandler({ DuplicateDataException.class })
public @ResponseBody ExceptionResponse DuplicateDataRequestException(final Exception exception) {
return response;
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({ InvalidException.class })
public @ResponseBody ExceptionResponse handleInvalidException(final Exception exception) {
return response;
}
此处InvalidException.class
,DuplicateDataException.class
等是示例。您可以定义自定义异常并从控制器层抛出它们。例如,您可以定义UserAlreadyExistsException
并从异常处理程序返回HttpStatus.CONFLICT
错误代码。