根据请求动态返回HTTP状态码,使用@ExceptionHandler。
根据请求动态返回HTTP状态码,使用@ExceptionHandler。
我想根据响应对象错误动态返回HTTP状态码,例如400、400、404等。\n我参考了这个问题:Programmatically change http response status using spring 3 restful,但没有帮助。\n我有一个包含@ExceptionHandler
方法的Controller类:\n
@ExceptionHandler(CustomException.class) @ResponseBody public ResponseEntity> handleException(CustomException e) { return new ResponseEntity( new MyErrorResponse(e.getCode(), ExceptionUtility.getMessage(e.getMessage())), ExceptionUtility.getHttpCode(e.getCode())); }
\nExceptionUtility
是一个类,我在其中有上述两个方法(getMessage
和getCode
)。\n
public class ExceptionUtility { public static String getMessage(String message) { return message; } public static HttpStatus getHttpCode(String code) { return HttpStatus.NOT_FOUND; //如何在这里动态返回状态码? } }
\n我不想使用if条件来检查并相应地返回响应代码,有没有其他更好的方法来实现这个?
问题的出现原因:
这段代码中的异常处理方法是静态的,即每个异常都有一个固定的返回HTTP状态码。因此,无法根据请求的情况动态地返回不同的状态码。
解决方法:
为了根据请求动态返回不同的状态码,需要为不同的异常定义不同的异常处理方法,并使用@ExceptionHandler注解来标识每个方法处理的异常类型。在这些方法中,可以根据异常类型返回不同的HTTP状态码。
以下是一个示例的解决方法:
@ExceptionHandler(UnAuthorizedException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) public ExceptionResponse unAuthorizedRequestException(final Exception exception) { return response; } @ExceptionHandler(DuplicateDataException.class) @ResponseStatus(HttpStatus.CONFLICT) public ExceptionResponse DuplicateDataRequestException(final Exception exception) { return response; } @ExceptionHandler(InvalidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public ExceptionResponse handleInvalidException(final Exception exception) { return response; }
在这个示例中,UnAuthorizedException对应的处理方法返回的HTTP状态码是UNAUTHORIZED,DuplicateDataException对应的处理方法返回的HTTP状态码是CONFLICT,InvalidException对应的处理方法返回的HTTP状态码是BAD_REQUEST。你可以根据自己的需要定义自己的异常,并在处理方法中返回相应的HTTP状态码。
这种方式解决了静态返回固定状态码的问题,实现了根据请求动态返回不同状态码的功能。但是需要注意的是,这是Spring异常处理的基本方式,如果你使用的是Spring框架,可以采用这种方式。如果你有更好的解决方法,欢迎留言讨论。
问题的出现原因:
问题是由于需要根据请求动态返回HTTP状态码,但是在处理异常的方法中却没有设置响应的状态码导致的。
解决方法:
解决方法是在处理异常的方法中添加一个HttpServletResponse参数,这样就可以设置响应的状态码。另外,需要注意的是该方法不能使用@ExceptionHandler
注解。
在(CustomException.class)
方法中,首先通过ExceptionUtility.getHttpCode(e.getCode()).value()
获取异常对应的HTTP状态码,并通过resp.setStatus()
方法设置响应的状态码。然后通过new ResponseEntity<MyErrorResponse>()
方法创建一个包含异常信息的响应实体,并返回。
在(NestedServletException.class)
方法中,首先通过ex.getCause()
方法获取实际的异常。然后根据不同的异常类型来设置不同的HTTP状态码。如果是MyBusinessLogicException
类型的异常,则设置状态码为HttpStatus.UNPROCESSABLE_ENTITY.value()
,并返回对应异常的结构。如果是AuthenticationException
类型的异常,则设置状态码为HttpStatus.UNAUTHORIZED.value()
。如果是AccessDeniedException
类型的异常,则设置状态码为HttpStatus.FORBIDDEN.value()
。如果是其他类型的异常,则设置状态码为HttpStatus.INTERNAL_SERVER_ERROR.value()
。最后返回其他错误的结构。
以上就是根据请求动态返回HTTP状态码的问题的出现原因以及解决方法。
问题的出现原因是想要根据请求动态地返回HTTP状态码。解决方法有两种。
第一种方法是在自定义异常类CustomException中添加一个HttpStatus字段。抛出异常时,可以使用HttpStatus来指定错误状态码。在异常处理器中,可以根据异常对象的getHttpStatus()方法返回的状态码来构建响应实体。
第二种方法是声明一个枚举ErrorCode,将HttpStatus作为枚举的一个属性。在异常处理器中,可以根据异常对象的getHttpStatus()方法返回的状态码来构建响应实体。如果不想改变自定义异常类的code字段类型,可以在枚举中添加一个辅助方法getHttpStatus(String code),根据code的值获取对应的HttpStatus。
以上是根据请求动态返回HTTP状态码的解决方法。