@ControllerAdvice无法捕获org.springframework.dao.EmptyResultDataAccessException

时间:2017-03-07 20:46:52

标签: java spring jdbctemplate

我目前正在使用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("/");
    }

}

1 个答案:

答案 0 :(得分:0)

你可能已经想到了这一点。但是我注意到在你的异常处理程序类中,我将用于处理EmptyResultDataAccessException异常的方法,命名正确handleEmptyResultDataAccessException实际上配置为捕获
基于注释的IncorrectResultSizeDataAccessException异常:

@ExceptionHandler(IncorrectResultSizeDataAccessException.class)
相关问题