2017-03-07 9 views
0

현재 전역 예외 처리기를 사용하여 서버에 던져진 모든 예외를 json 객체로 래핑하는 java 구성 스프링 4로 작성된 API를 작성하고 있습니다. 나는 jdbcTemplate 메소드 인 queryForObject()에 의해 던져지는 EmptyResultDataAccessException을 제외하고는 내가 실행 한 모든 예외에 대해이 함수가 작동하도록했다. 그것은 현재 내가 던질 수있는 모든 다른 예외를 위해 일하고 있지만,이 특별한 것에 대해서는 실패합니다. 어떤 도움을 주시면 감사하겠습니다.@ControllerAdvice가 org.springframework.dao.EmptyResultDataAccessException을 catch하지 못했습니다.

컨트롤러의 조언 :

@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; 
    } 
} 

응용 프로그램 구성 :

@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/"); 
    } 
} 

앱 이니셜 : 당신은 아마 이미 지금이 알아 낸

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

. 그러나 나는 당신이라는 EmptyResultDataAccessException 예외를 처리하는 데 사용하는 거라고 부담 당신의 예외 핸들러 클래스, 방법에서 발견 적절하게 handleEmptyResultDataAccessException 실제로 주석에 따라
IncorrectResultSizeDataAccessException 예외 잡기 위해 구성되어

@ExceptionHandler(IncorrectResultSizeDataAccessException.class)