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

may*_*ats 5 java validation spring

我有一个实体 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;
Run Code Online (Sandbox Code Playgroud)

并且有一个接口XYZCRUD.java可以进行CRUD操作XYZ.java

@Validated
public interface XYZCRUD {

  public int insert(@Valid XYZ entity) throws SomeException;
Run Code Online (Sandbox Code Playgroud)

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

@Validated
public interface XYZCRUD {

      public int insert(@Validated(value=SomeGroup.class) XYZ entity) throws SomeException;
Run Code Online (Sandbox Code Playgroud)

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

结论: @Validated不会触发@NotNull

问题:

  1. 为什么@Validated不会触发javax的@NotNull?我做错了什么或不支持它?
  2. 还有其他方法吗?无法实现自定义验证器

注意:如果它与此有关,我也使用lombok.

may*_*ats 2

看起来 @Validated 正在做它的工作,只是用组标记“参数”,但是验证框架如何解释(“拦截”)这是一个不同的故事。就我而言,这就是截取和验证方法级别验证时发生的情况

来自 Spring 的 MethodValidationInterceptor 的文档

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

这意味着只有在级别提到的组才会被验证,并且它们将用于所有公共方法

@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;
Run Code Online (Sandbox Code Playgroud)

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