Я читал об исключениях на основе контроллера, используя @ 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 от моего контроллера.Возможно ли что-то подобное?Или я должен пройти через процесс создания пользовательских исключений ошибок для всего, как описано в документации.
Чтобы прояснить, я требую, чтобы исключение прерывало любой текущий процесс, возможно, выборку данных из базы данных,и немедленно вернуть данное исключение клиенту.У меня есть настройка веб-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);
}