1

Hibernate検証アノテーションでアノテーションが付けられたエンティティを持つモデルオブジェクトがあります。たとえば、@ NotBlank、@ NotNull、@Length。モデルオブジェクトのインスタンスを装飾するこのモデルをサポートするフォームがあります。このインスタンスに@NotNull、@Validアノテーションを付けました。このバッキングフォームのバリデーターをコントローラークラスに登録しています。@RequestMappingメソッドの引数に@Validアノテーションが付けられている場合、フォームバリデーターが呼び出されます。

モデルにも@Entityアノテーションが付けられていることに注意してください。モデルのバッキングフォームは、モデルの薄いラッパーにすぎません。

しかし、装飾されたオブジェクトの検証はチェックされていませんか?リクエストマッピングメソッドの定義でBindResultにエラーがないかチェックしますが、エラーがないため、これを知っています。私のフォームフィールドはすべて空なので、@NotBlankで注釈が付けられた装飾モデルのフィールドの検証をチェックする必要があります。しかし、それは起こりません。

これを修正するのを手伝ってもらえますか?

編集:サンプルコード

@Entity
class MyModel {
    @Id
@GeneratedValue(strategy = GenerationType.AUTO)
    @Column(nullable=false)
    private Long id;

    @NotBlank
    @Column(unique=true, length=30, nullable=false)
    private String number;

    @Column(length=30, nullable=false)
    @Length(min=1, max=30)
private String firstName;
    /* ... getters and setters ... */
}

public class MyModelBackingForm {

   @NotNull
   @Valid
   private MyModel model;
   /* ... delegate getters and setters for all fields in MyModel ...  */
 }

編集:コントローラーコードを追加

@InitBinder
protected void initBinder(WebDataBinder binder) {
  binder.setValidator(new MyBackingFormValidator());
}

編集:

public class MyBackingFormValidator implements Validator {

  public MyBackingFormValidator() {
    super();
  }

  @Override
  public boolean supports(Class<?> clazz) {
    return Arrays.asList(MyBackingForm.class, MyModel.class).contains(clazz);
  }

  @Override
  public void validate(Object obj, Errors errors) {
   // custom validation code commented ... as I want to check if JSR 303 validations invoked
  }
}
4

1 に答える 1

0

これは、Hibernate検証を使用していた方法のサンプルコードです。フェッチされたオブジェクトに対して@validを呼び出し、バインディング結果を取得しました。このようにして、フォームで実行する必要のある検証を認識します。編集:カスタムおよび標準のバリデーターを呼び出す方法は?

@InitBinderを使用すると、カスタムバリデーターインスタンスを渡すことができます。このインスタンスにも、binder.getValidator()を使用して標準バリデーターのクラスパラメーターを渡すことができます。

礼儀:Rohit Banga

@Controller
@RequestMapping("/customer")
public class CustomerController {

//編集:

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
binder.setValidator(new CustomFormValidator(binder.getValidator())); 
}

    @RequestMapping(value = "/signup", method = RequestMethod.POST)
    public String addCustomer(@Valid Customer customer, BindingResult result) {

        if (result.hasErrors()) {
            return "form";
        } else {
            return "success";
        }

    }

    @RequestMapping(method = RequestMethod.GET)
    public String customerForm(ModelMap model) {

        model.addAttribute("customer", new Customer());
        return "form";

    }

}
于 2012-10-20T07:31:40.473 に答える