忽略弹簧mvc对选择性实体字段的JSR-303验证

时间:2015-02-10 12:15:03

标签: spring spring-mvc spring-validator

我有spring4 mvc应用程序来保存一个地址实体,代码位如下。

我的控制器

@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;

  ........
}

我的表单只包含街道图钉作为字段,因为在验证其他表单值后,我应该设置 createdBy 。< / p>

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

  1. 您需要阅读Validation Groups。这允许您根据“方案”

  2. 使用不同的验证器
  3. 使用Spring的@Validated注释来使用组

  4. 如果不保护createdBy字段,用户可以通过更改POST变量来更改它。请参阅DataBinder.setDisallowedFields()

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

  6. 听起来你想在这里使用一个Form Backing Object(一个仅为表单制作的常规非JPA POJO),并将值复制到你的真实实体。