2017-03-07 15 views
0

私は現在、グローバル例外ハンドラを使用してサーバー上にスローされたすべての例外をjsonオブジェクトにラップする、Javaで構成されたSpring 4で構築されたAPIに取り組んでいます。私は、jdbcTemplateメソッドqueryForObject()によってスローされるEmptyResultDataAccessExceptionを除いて、私が実行したすべての例外に対してこれを動作させることができました。それは現在私がそれに投げることができる他のすべての例外のために働いているが、この特定のもので失敗する。どんな助けもありがとう。@ControllerAdviceはorg.springframework.dao.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; 
    } 
} 

アプリの設定:

@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

あなたはおそらくすでに今ではこれを考え出しました。

@ExceptionHandler(IncorrectResultSizeDataAccessException.class) 
:しかし、私はあなたの例外ハンドラクラスで気づいた、handleEmptyResultDataAccessException、適切な名前、私はあなたがEmptyResultDataAccessExceptionの例外を処理するために使用するつもりだった引き受ける方法は、実際には、アノテーションに基づいて
IncorrectResultSizeDataAccessExceptionの例外をキャッチするように設定され
関連する問題