Spring ExceptionHandler выполняется даже после того, как приложение перехватывает конкретное исключение - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблемы с обработкой исключений весной.

У меня есть @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);
            }
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...