Я использую 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()
.Тем не менее, я хочу знать, смогу ли я избежать этого и исключить эту жестко закодированную проверку из хранилища.