我有一个模型对象,其中包含使用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
}
}
答案 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";
}
}