我在@ExceptionHandler
带注释的类中有一个@ControllerAdvice
注释方法。
此方法必须捕获所有异常,但在之后某些默认处理程序处理了一些异常,而不是第一个处理程序(例如,它不应该处理{{1} ,否则转发到登录页面,由Spring完成,不再起作用了。)
我发现了很多东西,但要么旧(不使用org.springframework.security.access.AccessDeniedException
),要么使用无法使用的接口,因为 html和JSON必须符合返回类型方法签名(使用类@ControllerAdvice
,而不是某些ModelAndView或String)。
我当前的异常处理程序测试方法,工作正常:
ResponseEntity
它基本上只决定返回错误的格式。
当仍然维护 Spring默认异常处理程序时,如何降低此异常处理程序的优先级?我需要添加一些花哨的Java-Config吗?
我已经尝试创建一个实现@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleExceptions(Exception ex, HttpServletRequest request) throws Exception {
HttpHeaders headers = new HttpHeaders();
//sort MIME types from accept header field
String accept = request.getHeader("accept");
if(accept != null) {
String[] mimes = accept.split(",");
//sort most quality first
Arrays.sort(mimes, new MimeQualityComparator());
//if json, return as json
String firstMime = mimes[0].split(";")[0];
if (firstMime.equals("application/json")) {
ExceptionWrapper exceptionVO = new ExceptionWrapper(ex);
headers.setContentType(MediaType.APPLICATION_JSON);
return new ResponseEntity<ExceptionWrapper>(exceptionVO, headers, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
//if not json, return as html
headers.setContentType(MediaType.TEXT_HTML);
String error = "<h1>Internal Server Error 500</h1><br>";
error += "Please copy the following text and send it to your server admin:<br><br>";
error += "<pre>" + ExceptionUtils.getStackTrace(ex) + "</pre>";
return new ResponseEntity<String>(error, headers, HttpStatus.INTERNAL_SERVER_ERROR);
}
的类,并在那里覆盖了ResponseEntityExceptionHandler
方法,但是没有用。 Spring抱怨它无法找到一个handleExceptionInternal
对象传递给重写的方法(我也试过将它作为bean提供)。
我还尝试在HttpStatus
上使用@Order
,但没有改变任何内容。
Spring Version 4.0.9