Nếu, giống như tôi, bạn đang mắc kẹt với mùa xuân 3.1 (chỉ 0,1 vesrsions sau @ControllerAdvice
) bạn có thể thử giải pháp này tôi chỉ đưa ra.
Vì vậy, bạn đã từng nghe về giải pháp ngoại lệ, phải không? Nếu chưa, hãy đọc ở đây:
@Component
public class RestExceptionResolver extends ExceptionHandlerExceptionResolver {
@Autowired
//If you have multiple handlers make this a list of handlers
private RestExceptionHandler restExceptionHandler;
/**
* This resolver needs to be injected because it is the easiest (maybe only) way of getting the configured MessageConverters
*/
@Resource
private ExceptionHandlerExceptionResolver defaultResolver;
@PostConstruct
public void afterPropertiesSet() {
setMessageConverters(defaultResolver.getMessageConverters());
setOrder(2); // The annotation @Order(2) does not work for this type of component
super.afterPropertiesSet();
}
@Override
protected ServletInvocableHandlerMethod getExceptionHandlerMethod(HandlerMethod handlerMethod, Exception exception) {
ExceptionHandlerMethodResolver methodResolver = new ExceptionHandlerMethodResolver(restExceptionHandler.getClass());
Method method = methodResolver.resolveMethod(exception);
if (method != null) {
return new ServletInvocableHandlerMethod(restExceptionHandler, method);
}
return null;
}
public void setRestExceptionHandler(RestExceptionHandler restExceptionHandler) {
this.restExceptionHandler = restExceptionHandler;
}
public void setDefaultResolver(ExceptionHandlerExceptionResolver defaultResolver) {
this.defaultResolver = defaultResolver;
}
}
Sau đó một handler dụ sẽ trông như thế này
@Component
public class RestExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
public Map<String, Object> handleException(ResourceNotFoundException e, HttpServletResponse response) {
Map<String, Object> error = new HashMap<>();
error.put("error", e.getMessage());
error.put("resource", e.getResource());
return error;
}
}
Tất nhiên bạn sẽ không quên đăng ký Beens bạn
Sau đó tạo một bộ lọc được gọi trước bộ lọc của bạn (tùy chọn tất cả 'em)
Sau đó, trong bộ lọc
try{
chain.doFilter(request, response);
catch(Exception e){
exceptionResolver(request, response, exceptionHandler, e);
//Make the processing stop here...
return; //just in case
}
Nguồn
2016-11-07 11:04:24
Ngoài ra kiểm tra này http://stackoverflow.com/questions/34595605/how-to-manage-exceptions-thrown-in-filters-in-spring – kopelitsa
Xem ở đây https://stackoverflow.com/questions/34595605/cách-to-quản lý-ngoại lệ-ném-trong-bộ lọc-in-spring/43242424, tôi đã làm việc đó để sử dụng '' '@ ExceptionHanlder''' cho một' '' ngoại lệ''' đã được được ném vào một '' 'Bộ lọc''' – Raf