我有一个实体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;
在XYZ.java上有一个接口XYZCRUD.javato做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
问题:
>为什么@Validated不会触发javax的@NotNull?我在做什么
错了还是不支持呢?
>还有其他方法吗?无法实现自定义验证器
注意:如果它与此有关,我也使用lombok.
最佳答案
似乎@Validated正在做它的工作,只是用组标记“参数”但是如何通过验证框架解释(“截获”)是一个不同的故事.
就我而言,这是在方法级别验证被截获和验证时发生的情况
就我而言,这是在方法级别验证被截获和验证时发生的情况
来自Spring的MethodValidationInterceptor的文档
Validation groups can be specified through Spring’s Validated annotation at the type level of the containing target class,applying to all public service methods of that class. By default,JSR-303 will validate against its default group only.
这意味着将在类级别提及的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;
我不明白这种实施的原因,但这就是文档所说的.如果有人知道原因,请发表评论.