我有一些控制器的方法:
@RequestMapping("/")
@AuthorizedRNUser
public Object index(UserStateVO userStateVO) {
return userStateVO;
}
我也有UserlerVO参数的HandlerMethodArgumentResolver
public class UserStateArgumentHandlerResovler implements HandlerMethodArgumentResolver{
@Autowired
RNService service;
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getMethod().isAnnotationPresent(AuthorizedRNUser.class) && methodParameter.getParameterType() == UserStateVO.class;
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
UserStateVO userState = service.getUserState();
if (isNull(userState))
// here i need to return 403 HTTP response
throw new RuntimeException("User is not allowed");
return userState;
}
}
如果UserStateVO为null,我需要返回403 HTTP响应,但我不知道是否可能?如何最好地检查UserStateVO并将其传递给控制器或返回HTTP响应?
答案 0 :(得分:1)
使用与处理MVC exception-handling-in-spring-mvc
中的异常相同的方法添加自定义例外,例如
public class BadRequestException extends RuntimeException {
private static final long serialVersionUID = 1L;
public BadRequestException(String message) {
super(message);
}
}
使用@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "User is not allowed")
注释或使用
@ControllerAdvice
类
@ExceptionHandler(value = { BadRequestException.class })
@ResponseStatus(value = HttpStatus.FORBIDDEN)
@ResponseBody
public Map<String, String> handleBadRequestException(BadRequestException e) {
Map<String, String> retMessages = new HashMap<>();
retMessages.put("message", e.getMessage());
return retMessages;
}
剩下的只是抛弃它
if (isNull(userState))
// here i need to return 403 HTTP response
throw new BadRequestException("User is not allowed");