Spring MVC를 사용하여 커스텀 예외 처리를 처리하려고합니다. 서비스 레이어와 서비스 레이어에 의한 DAO 레이어 예외 핸들러는 그 예외를 랩핑하고 Spring MVC에 의해 컨트롤러 예외 핸들러에 의해 그 예외를 처리한다. 다음은 내 코드입니다 :Spring MVC를 사용하여 서비스 계층에서 DAO 예외를 감쌀 수 없습니다.
@Override
public void saveNewMachineDetails(Machine machine, Configurations configurations) throws DataNotPersist{
logger.info("call service saveNewMachineDetails method");
try{
machineRepository.saveAndFlush(machine);
}catch(Exception ex){
// logger.error(ex.getMessage());
DataNotPersist dataNotPersist = new DataNotPersist(messageSource.getMessage("code.object.notpersist", null, null),
messageSource.getMessage("msg.object.notpersist", new Object[]{"Machine"}, null), ex);
throw dataNotPersist;
}}
위의 코드에서 DAO 레이어 예외는 서비스 레이어에서 처리하고 사용자 지정 예외에서 해당 예외를 래핑하고 해당 예외를 throw합니다.
웹 레이어에서 예외 처리를 위해 예외 처리기를 구성했지만 예외가 throw되면 처리기가 예외를 catch하지 않기 때문에 사용자 정의 예외로 실제 예외를 감쌀 수 없기 때문에 생각합니다.
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = DataNotPersist.class)
public ModelAndView defaultExceptionHandler(HttpServletRequest request, DataNotPersist ex)throws Exception {
logger.info("In GlobalExceptionHandler");
logger.debug("********* : "+ex.getMessage());
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception", ex);
modelAndView.addObject("url", request.getRequestURL());
modelAndView.setViewName("common/error");
return modelAndView;
}}