我目前正在使用java配置的spring 4构建的api,它使用全局异常处理程序将服务器上抛出的所有异常包装到json对象中。除了由jdbcTemplate方法queryForObject()抛出的EmptyResultDataAccessException之外,我已经成功地解决了我遇到的每个异常。它目前正在为我可以抛出的所有其他异常工作,但在这个特定的异常上失败了。任何帮助将不胜感激。
控制器建议:
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
private static final Logger logger = Logger.getLogger(GlobalExceptionHandler.class);
// 400
@ExceptionHandler(IncorrectResultSizeDataAccessException.class)
protected ResponseEntity<Object> handleEmptyResultDataAccessException(IncorrectResultSizeDataAccessException ex, HttpHeaders headers,
HttpStatus status, WebRequest request) {
logger.info(ex.getClass()
.getName());
final ApiError apiError = new ApiError.Builder(HttpStatus.BAD_REQUEST, ex.getLocalizedMessage(), "no results found").build();
return handleExceptionInternal(ex, apiError, headers, apiError.getStatus(), request);
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers,
HttpStatus status, WebRequest request) {
logger.info(ex.getClass()
.getName());
ApiError apiError = new ApiError.Builder(HttpStatus.BAD_REQUEST, ex.getLocalizedMessage(),
getAllErrorsFromBindingResult(ex.getBindingResult())).build();
return handleExceptionInternal(ex, apiError, headers, apiError.getStatus(), request);
}
//...
// 500
@ExceptionHandler({Exception.class, IOException.class, DaoException.class})
public ResponseEntity<Object> handleAll(final Exception ex, final WebRequest request) {
logger.info(ex.getClass()
.getName());
logger.error("error", ex);
final ApiError apiError = new ApiError.Builder(HttpStatus.BAD_REQUEST, ex.getLocalizedMessage(), "error occurred").build();
return new ResponseEntity<Object>(apiError, new HttpHeaders(), apiError.getStatus());
}
// Helper Methods
private List<String> getAllErrorsFromBindingResult(BindingResult ex) {
List<String> errors = new ArrayList<>();
ex.getFieldErrors()
.forEach(fieldError -> errors.add(fieldError.getField() + ": " + fieldError.getDefaultMessage()));
ex.getGlobalErrors()
.forEach(objectError -> errors.add(objectError.getObjectName() + ": " + objectError.getDefaultMessage()));
return errors;
}
}
App Config:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "app")
@Import(SwaggerConfig.class)
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
super.addViewControllers(registry);
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:7070");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
App Initializer:
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(CeciAppConfig.class);
ctx.setServletContext(servletContext);
ServletRegistration.Dynamic dynamic = servletContext.addServlet("ceci-admin-service-dispatcher", new DispatcherServlet(ctx));
dynamic.setLoadOnStartup(1);
dynamic.addMapping("/");
}
}
答案 0 :(得分:0)
你可能已经想到了这一点。但是我注意到在你的异常处理程序类中,我将用于处理EmptyResultDataAccessException异常的方法,命名正确handleEmptyResultDataAccessException实际上配置为捕获
基于注释的IncorrectResultSizeDataAccessException异常:
@ExceptionHandler(IncorrectResultSizeDataAccessException.class)