我有一个实体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
to对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
问题:
注意:如果它与此有关,我也使用lombok。
似乎@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;
我不明白这种实施的原因,但这就是文档所说的。如果有人知道原因,请发表评论。
@ mayank-vats如果要将组应用于特定方法(不是所有公共方法),可以使用:
@Validated
public class MyClass {
@Validated({Group1.class})
public myMethod1(@Valid Foo foo) { ... }
@Validated({Group2.class})
public myMethod2(@Valid Foo foo) { ... }
...
}
对于@NotNull,您需要添加默认组:
@Validated({ Default.class, Group1.class })
public myMethod1(@NotNull @Valid Foo foo) { ... }