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