如何使用SpringMVC @Valid来验证POST中的字段,而不是PUT

时间:2015-11-16 18:10:34

标签: spring spring-mvc bean-validation

我们正在使用SpringMVC创建一个RESTful API,我们有一个/ products端点,其中POST可用于创建新产品,PUT用于更新字段。我们还使用javax.validation来验证字段。

在POST工作正常,但是在PUT中,用户只能传递一个字段,而且我不能使用@Valid,所以我需要复制所有使用注释和Java代码进行PUT的验证。

任何人都知道如何扩展@Valid注释并创建像@ValidPresents或其他能解决我问题的东西?

2 个答案:

答案 0 :(得分:7)

您可以将验证组与Spring org.springframework.validation.annotation.Validated注释一起使用。

  

Product.java

class Product {
  /* Marker interface for grouping validations to be applied at the time of creating a (new) product. */
  interface ProductCreation{}
  /* Marker interface for grouping validations to be applied at the time of updating a (existing) product. */
  interface ProductUpdate{}

  @NotNull(groups = { ProductCreation.class, ProductUpdate.class })
  private String code;

  @NotNull(groups = { ProductCreation.class, ProductUpdate.class })
  private String name;

  @NotNull(groups = { ProductCreation.class, ProductUpdate.class })
  private BigDecimal price;

  @NotNull(groups = { ProductUpdate.class })
  private long quantity = 0;
}
  

ProductController.java

@RestController
@RequestMapping("/products")
class ProductController {
  @RequestMapping(method = RequestMethod.POST)
  public Product create(@Validated(Product.ProductCreation.class) @RequestBody Product product) { ... }

  @RequestMapping(method = RequestMethod.PUT)
  public Product update(@Validated(Product.ProductUpdate.class) @RequestBody Product product) { ... }
}

使用此代码后,Product.codeProduct.nameProduct.price将在创建和更新时进行验证。但是,Product.quantity仅在更新时才会得到验证。

答案 1 :(得分:0)

如果您实现接口Validator以自定义验证并通过反射检查您对任何Type的约束。

8.2 Validation using Spring’s Validator interface