如何使用基于组的@Validated注释验证方法参数

时间:2015-08-05 08:16:06

标签: java spring validation

我有一个实体XYZ.java

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class XYZ extends BaseEntity implements Serializable {

  @NotNull (groups = {Groups.Insert.class, Groups.Delete.class, Groups.Update.class, Groups.Select.class})
  private String X;

并且有一个接口XYZCRUD.java可以在XYZ.java

上执行CRUD操作
@Validated
public interface XYZCRUD {

  public int insert(@Valid XYZ entity) throws SomeException;

虽然javax的@Valid适用于@NotNull验证,但它不支持将验证组作为注释属性从我触发验证的方法中传递。 所以我尝试使用@Validated注释,它允许通过属性“值”传递组,如此

@Validated
public interface XYZCRUD {

      public int insert(@Validated(value=SomeGroup.class) XYZ entity) throws SomeException;

然而,它根本不会触发验证。我在从字段中删除groups属性后尝试,也从触发器注释中尝试。

结论: @Validated不会触发@NotNull

问题:

  1. 为什么@Validated不会触发javax的@NotNull?我在做什么     错了还是不支持呢?
  2. 还有其他方法吗?无法实现自定义验证器
  3. 注意: 我也在使用lombok,如果它与此有关。

3 个答案:

答案 0 :(得分:2)

似乎@Validated正在做的工作只是标记"参数"与群体有关但是如何通过验证框架解释("截获")是一个不同的故事。 就我而言,这是在方法级别验证被截获和验证时发生的事情

来自Spring的MethodValidationInterceptor文档

  

验证组可以通过Spring的包含目标类的类型级别的Validated批注指定,适用于该类的所有公共服务方法。默认情况下,JSR-303将仅针对其默认组进行验证。

这意味着系统级别提及的 ONLY 组将被验证,并且它们将用于所有公共方法

@Validated(value=SomeGroup.class)//this will be used as group for all methods being validated
public interface XYZCRUD {

public int insert(@Valid XYZ entity) throws SomeException;
public int delete(@Valid XYZ entity) throws SomeException;

我不明白这种实施的原因,但这就是文档所说的。如果有人知道原因,请发表评论。

答案 1 :(得分:2)

@ mayank-vats如果要将组应用于特定方法(不是所有公共方法),可以使用:

@Validated
public class MyClass {

    @Validated({Group1.class})
    public myMethod1(@Valid Foo foo) { ... }

    @Validated({Group2.class})
    public myMethod2(@Valid Foo foo) { ... }

    ...
}

答案 2 :(得分:0)

对于@NotNull,您需要添加defgault组:

@Validated({ Default.class, Group1.class })
public myMethod1(@NotNull @Valid Foo foo) { ... }