1

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

답변

0

ControllerAdvice는 서비스 계층에서 일어나는 예외를 포착하지 않습니다 : 다음 나의 예외 핸들러 코드입니다. 워드 프로세서

에서 일반적으로 모든 @RequestMapping 방법에 적용 ExceptionHandler 방법을 정의하는 데 사용됩니다.

그래서 적용하려면 ControllerAdvice 방법 위해, 컨트롤러 방법 내가 다시 거래를 제외하고, 스프링 롤을 던질 때 서비스 계층에서 예외

1

DataNotPersist을 던져 포장해야한다 내 보기에 에 Exception을 입력하십시오. 이제 나는 내 Exception 클래스로 트랜잭션 롤백을 처리합니다.

@Override 
@Transactional(value="transaction_manager", rollbackFor={DataNotPersist.class}) 
public void saveNewMachineDetails(Machine machine, Configurations configurations) throws DataNotPersist{ 
    logger.info("call service saveNewMachineDetails method"); 

    try{ 
     machineRepository.saveAndFlush(machine); 
    }catch(DataAccessException 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; 
    }}