Как обрабатывать исключение Spring BindingResult из внутреннего класса @Entity, проверенного с помощью Hibernate перед сохранением

У меня есть два компонента @Entity. Bean one - это "один ко многим" для второго. Bean1 и Bean2 имеют разные средства проверки аннотаций JSR303.

@Entity
class Bean1 {
    @OneToMany
    private List<Bean2> var;

    //other fields marked with JSR303
}

@Entity
class Bean2 {
    //other fields marked with JSR303
}

Моя задача - проверить внутренний Bean2. Во-первых, у меня есть контроллер с @Validated of Bean1.

@Controller
class Controller {
    public String methodPOST(@Validated Bean1 bean1, BindingResult errors)
}

Hibernate автоматически проверяет JSR303 перед попыткой сохранения в БД. Итак, у меня даже нет никаких исключений проверки от Bean2, потому что Spring их не обрабатывает, а Hibernate выбрасывает.

Я могу создать что-то вроде DTO-бинов и проверить их, и внутренний Bean2DTO будет проверен, если пометить его как @Valid, и со стороны Hibernate не будет выдано исключение, потому что перед сохранением нет проверки. Также в этом случае я заполню BindingResult в методе контроллера.

Есть ли какое-то решение, чтобы получить javax.validation.ConstraintViolationException, выброшенное из Hibernate org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(..) в мой BindingResult без двух вышеуказанных параметров.

Кроме того, я не могу отключить автоматическую проверку Hibernate перед сохранением из-за повреждения другой логики.

Спасибо.


person Yaroslav Boichuk    schedule 20.08.2013    source источник


Ответы (1)


Возможный дубликат можно найти здесь

Напомним, вам нужно аннотировать вложенное свойство с помощью @Valid.

@Entity
class Bean1 {
  @OneToMany
  @Valid
  private List<Bean2> var;

  //other fields marked with JSR303
}

@Entity
class Bean2 {
  //other fields marked with JSR303
}

Это также должно вызвать вложенную проверку в Spring (при условии, что у нее также настроен валидатор JSR-303).

person M. Deinum    schedule 20.08.2013
comment
Неважно, есть ли аннотация Valid или нет, потому что hibernate всегда проверяется перед сохранением, он выдаст то же исключение, что я описал выше, с Valid или без него. - person Yaroslav Boichuk; 20.08.2013
comment
Я нашел проблему, которая у меня была. У меня была аннотация Validated с указанной группой, и аннотация Valided не работает, потому что проверяет также группу, указанную в Validated. Большое спасибо за идею предложения! - person Yaroslav Boichuk; 20.08.2013