2015-02-10 77 views
2

我有spring4 mvc应用程序来保存Address实体,代码位如下。忽略选择实体字段的弹簧mvc JSR-303验证

我的控制器

@RequestMapping(value = "addAddress", method = POST) 
public String registerComplaint(@Valid @ModelAttribute final Address address, final BindingResult resultBinder) { 
    if (resultBinder.hasErrors()) 
     return "addAddress"; 
    addressService.addAddress(address); 
    return "redirect:myAddress"; 
} 

我的实体

@Entity 
@Table(name = "address") 
public class Address { 
    @NotNull 
    private String street; 

    @NotNull 
    private String pin; 

    @NotNull 
    private String createdBy; 

    ........ 
} 

我的形式conatins只有街道的领域,在那里为createdBy应该由我确认后,其他设置形式值。

这里的问题是春天JSR303验证支持正在验证一个字段,即createdBy,我不想通过春天mvc验证。

如何指示spring mvc不使用@Valid注释验证这些可选字段。

有没有什么办法可以跳过这样的字段使用spring mvc?

回答

2

验证主要是针对用户输入的。由于您将自己设置createdBy,只需在保存之前进行设置(例如@PrePersist),或者将新日期作为默认值。如果您需要为createBy强制执行约束,则可以在模式级别执行此操作。

@Column(nullable=false, ...) 
private String createdBy = new Date(); 
+0

感谢,它的真实性,但如果我们想要JPA提供程序级别验证,例如启动休眠验证,我们需要有验证注释仪式?在这种情况下,这种方法不会奏效。我的问题是生活的所有领域与验证注解是反正我们可以指示弹簧mvc跳过一些选择性字段 – Nick 2015-02-10 12:41:12

1
  1. 您需要在Validation Groups阅读起来。这允许您使用取决于“方案”

  2. 使用Spring的@Validated标注不同的验证使用组

  3. 如果不保护createdBy领域,用户可以通过改变POST变量改变它。请参阅DataBinder.setDisallowedFields()

  4. 从概念上讲,引脚如何与地址相关?

这听起来像你想在这里使用一个表单支持对象(常规的非JPA POJO只是做一个表格),和值复制到你的真正的实体。

+0

谢谢,验证组太麻烦了,我可以想到定制LocalValidatorFactoryBean更好。 setDisallowedFields我已经设置的基础是什么字段我暴露在窗体中,而不是(我有多个窗体为同一个实体公开的字段可选)。该地址实体只是一个模拟不适用的概念。恐怕我可以在非JPA中进行简单验证。 – Nick 2015-02-10 19:10:51