2

2 つの @Entity Bean があります。Bean 1 は 2 番目の「1 対多」です。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 を検証することです。まず、Bean1 の @Validated を持つコントローラーがあります。

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

Hibernate は、DB に保持しようとする前に JSR303 を自動的に検証します。したがって、Bean2 からの検証例外はありません。Spring はそれらを処理せず、Hibernate がそれをスローするためです。

DTO Bean のようなものを作成して検証できます。@Valid とマークすると内部の Bean2DTO が検証され、永続化の前に検証がないため、Hibernate 側から例外はスローされません。その場合も、Controller メソッドに BindingResult を設定します。

上記の2つのオプションなしで、Hibernate org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(..) からスローされた javax.validation.ConstraintViolationException を私の BindingResult に取得する解決策はありますか。

また、他の量のロジックが破損しているため、永続化の前に Hibernate の自動検証を無効にすることはできません。

ありがとうございました。

4

1 に答える 1

3

可能な重複はここにあります

要約すると、ネストされたプロパティに @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 バリデーターも構成されていると仮定します)。

于 2013-08-20T14:14:57.357 に答える