Как создать пользовательское исключение при сбое валидации бина в весенней загрузке с Hibernate Validator? - PullRequest
1 голос
/ 30 июня 2019

Я использую Spring Boot 2.0.1 с включением validation-starter (который поставляется с Hibernate Validation 6.x ) и пытаюсь проверить параметр метода и вернуть объекты в моем слое репозитория Spring.В основном, для этого метода есть ParamObj и ReturnObj,

@Repository
@Validated // Spring integration of validation
public class MyRepoImpl implements MyRepo {

  @Override
  @Valid
  public ReturnObj myMethod(@Valid ParamObj param) throw CustomException {
    try {
       // makes a call that might throw an exception
    } catch (Exception e) {
      throw new CustomException(/*...*/, e);
    }

    return returnObj;
  }
}

ParamObj и ReturnObj оба используют простой набор аннотаций Bean Validation для некоторых своих свойств, например @Pattern, @Min и т. Д. Моя проблема в том, что с этими аннотациями, если ParamObj или ReturnObj не пройдут процесс проверки, MyRepoImpl#myMethod() выдаст javax.validation.ConstraintViolationException.

Однако, как вы можетесмотри, контракт на myMethod() обязывает бросить CustomException.Да, ConstraintViolationException - это RuntimeException, однако теперь вызывающая сторона MyRepoImpl#myMethod(), например, логика уровня обслуживания, должна перехватить это RuntimeException в дополнение к CustomException.

И причинаЯ должен предотвратить все исключения от пузырей из уровня обслуживания (для этого конкретного Spring @Service, который у меня вызывает этот репозиторий) - эта служба является частьюдлинный список сервисов, которые вызываются через оркестровку сервисов, которая создает больший охватывающий объект.Другими словами, этот фрагмент (результат, полученный с помощью MyRepoImpl) считается необязательным , и, следовательно, его сбой должен регистрироваться только в журнале, но не останавливает весь процесс .

По этой причине я не могу использовать ControllerAdvice для захвата ConstraintViolationException для всего приложения.

Моя цель - иметь возможность, когда проверка не проходит ни для параметра метода, ни для параметраreturn, чтобы бросить только CustomException обратно вызывающей стороне.

Возможно ли это только с аннотациями?Я изучил MethodValidationPostProcessor, но не могу понять, смогу ли я реализовать свой собственный для достижения этой цели.

PS Единственный способ, которым я могу думать, чтобы достичь этого, это отказаться от @Valid / @Validated иВызовите Validator#validate(obj, ...) программно для параметра и возвращаемого значения внутри блока try-catch, перехватите исключение ограничения и выведите my CustomException().Тем не менее, я хочу знать, смогу ли я избежать этого и исключить эту жестко закодированную проверку из хранилища.

...