在对象图上未调用Hibernate Validator

时间:2012-10-20 06:50:09

标签: java spring hibernate bean-validation

我有一个模型对象,其中包含使用hibernate验证注释注释的实体。例如@NotBlank,@ NotNull,@ Length。 我有一个支持这个模型的表单来装饰模型对象的一个​​实例。我用@NotNull,@ Valid注释注释了这个实例。我正在Controller类中为这个支持表单注册一个验证器,当@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
  }
}

1 个答案:

答案 0 :(得分: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";

    }

}