根据请求动态返回HTTP状态码,使用@ExceptionHandler。

19 浏览
0 Comments

根据请求动态返回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是一个类,我在其中有上述两个方法(getMessagegetCode)。\n

public class ExceptionUtility {
    public static String getMessage(String message) {
        return message;
    }
    public static HttpStatus getHttpCode(String code) {
        return HttpStatus.NOT_FOUND; //如何在这里动态返回状态码?
    }
}

\n我不想使用if条件来检查并相应地返回响应代码,有没有其他更好的方法来实现这个?

0
0 Comments

问题的出现原因:

这段代码中的异常处理方法是静态的,即每个异常都有一个固定的返回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框架,可以采用这种方式。如果你有更好的解决方法,欢迎留言讨论。

0
0 Comments

问题的出现原因:

问题是由于需要根据请求动态返回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状态码的问题的出现原因以及解决方法。

0
0 Comments

问题的出现原因是想要根据请求动态地返回HTTP状态码。解决方法有两种。

第一种方法是在自定义异常类CustomException中添加一个HttpStatus字段。抛出异常时,可以使用HttpStatus来指定错误状态码。在异常处理器中,可以根据异常对象的getHttpStatus()方法返回的状态码来构建响应实体。

第二种方法是声明一个枚举ErrorCode,将HttpStatus作为枚举的一个属性。在异常处理器中,可以根据异常对象的getHttpStatus()方法返回的状态码来构建响应实体。如果不想改变自定义异常类的code字段类型,可以在枚举中添加一个辅助方法getHttpStatus(String code),根据code的值获取对应的HttpStatus。

以上是根据请求动态返回HTTP状态码的解决方法。

0