현재 전역 예외 처리기를 사용하여 서버에 던져진 모든 예외를 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("/");
}
}