我已经阅读了有关使用@ExceptionHandler的基于控制器的异常的信息。
我已经阅读了有关使用@ControllerAdvice进行全局异常处理的信息。
我还阅读了有关扩展HandlerExceptionResolver以进行更深入的异常处理的信息。
但是,理想情况下,我想在应用程序的任何层上抛出一个全局异常,该异常具有指示返回给客户端的JSON响应的参数。
例如:
throw new CustomGlobalException(HttpStatus.UNAUTHORISED, "This JWT Token is not Authorised.") throw new CustomGlobalException(HttpStatus.FORBIDDEN, "This JWT Token is not valid.")
然后,这将基于我创建的模型以及状态(例如:)返回JSON响应:
{ "success" : "false", "message" : "This JWT Token is not Authorised." }
并将其作为我的控制器的REST响应返回。这样的事情可能吗?还是我必须按照文档中所述对所有内容进行自定义错误异常处理。
为了明确起见,我需要异常来中断正在进行的任何过程,也许从数据库中获取数据,然后立即将给定的异常返回给客户端。我有一个Web MVC安装程序。
更多详情:
@ControllerAdvice @RequestMapping(produces = "application/json") public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) public ResponseEntity<Object> handleCustomException(CustomException ex, WebRequest request) { Map<String, Object> response = new HashMap<>(); response.put("message", ex.getMessage()); return new ResponseEntity<>(response, ex.getCode()); } }
这里抛出异常:
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { logger.debug("Filtering request for JWT header verification"); try { String jwt = getJwtFromRequest(request); logger.debug("JWT Value: {}", jwt); if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) { String username = tokenProvider.getUserIdFromJWT(jwt); UserDetails userDetails = customUserDetailsService.loadUserByUsername(username); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken (userDetails, null, userDetails.getAuthorities()); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); } else { logger.error("No Valid JWT Token Provided"); throw new CustomException(HttpStatus.UNAUTHORIZED, "No Valid JWT Token Provided"); } } catch (Exception ex) { logger.error("Could not set user authentication in security context", ex); } filterChain.doFilter(request, response); }
下面我对如何处理异常后在这里,您可以编写自己的处理程序是这样的,
class CustomGlobalException { String message; HttpStatus status; } @ExceptionHandler(CustomGlobalException.class) public ResponseEntity<Object> handleCustomException(CustomGlobalException ex, WebRequest request) { Map<String, Object> response = new HashMap<>(); response.put("success", "false"); response.put("message", ex.getMessage()); return new ResponseEntity<>(response, ex.getStatus()); }
上面提到的代码将处理 CustomGlobalException 发生的任何一层代码。