У меня проблемы с обработкой исключений весной.
У меня есть @Controller, который вызывает @Service, и у меня есть отдельный ControllerAdvice.
Служба имеет два метода, methodA и methodB. Метод B - это то место, где возникает исключение. После того, как поймал его в его конкретной форме, например DuplicateKeyException
родительский класс снова его ловит. Если я сделаю родителя менее общим, чем просто ловлю Exception
например поймать только InterruptedException
, ExecutionException
, совет контроллера обнаруживает ошибку и возвращает ответ об ошибке.
Есть ли канонический способ перехватить это конкретное исключение DuplicateKeyException
и продолжить обработку, как будто ничего не произошло, и вернуть ответ клиенту без запуска ControllerAdvice?
Совет контроллера
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
//Do some error processing and return a view for the client
return mav;
}
}
Контроллер
@Controller
public ControllerClass(){
@RequestMapping("/test", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public ResponseEntity<Omitted> getCustomerData(omitted) throws SQLException, JsonProcessingException {
CustomerData customerData = serviceCalss.methodA();
//futher processing and return valid return type
return new ResponseEntity<Omitted>();
}
}
Услуги
public class ServiceClass{
public CustomerData methodA(){
try {
@SuppressWarnings("unchecked")
Collection<SomeType> someCollection = (Collection<SomeType>) result.get(); // this line possibly throws InterruptedException, ExecutionException
//do some stuff then call methodB
methodB();
}catch (Exception e) {
logger.error("Error getting aggregated results", e);
//Custom Error processing
}
}
}
public void methodB() {
try {
persistence.insertNewData(data);
}catch(DuplicateKeyException dke) {
logger.warn("Unable to create blah, Specific Error Message{}", dke);
}catch (SQLException e) {
Error error = new Error();
error.developerinfo = e.toString();
error.text = e.getMessage();
throw new CustomEXceptionWhichExtendsException("custom error message not related to this example, error);
}
}
}