DTO 级别的基于注释的验证发生在字段级别验证之前,如 @NotNull @Size 等
Annotation based validation on DTO level happens before field level validation like @NotNull @Size etc
我有一个 DTO class,我在其中设置了一些必填字段。
并且,基于另一个类型字段,其中值可以假设为 A & B
如果类型A,只需要检查1项就可以通过,如果B,也可以多于1项。
我需要检查列表在 DTO class 级别是否至少有 1 个值。而且,在自定义注释验证中,我需要根据 DTO 的类型字段检查列表的大小。
因此,在 DTO 中
@NotNull
@Size(min = 1)
private List<@NotBlank String> items;
并且,内部注释
if (cancelType == CancellationTypeEnum.A && cancelDto.getItems().size() > 1) {
isValid = false;
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(
"Only one item can be sent for 'A' cancel type.").addConstraintViolation();
}
但是,由于字段级别稍后发生,如果我为 items 字段传递 null,它将转到此注释验证器并抛出 NPE,因为字段为 null & 我正在尝试获取大小
临时解决方案是我先检查 null,然后检查大小,但无论如何在字段级别我们都会提供 @NotNull。
有什么方法可以在字段级验证发生后执行 class 级自定义注释来验证。
在这种情况下,它将抛出字段级验证,因为字段为空并且不会转到自定义 class 级注释
您可以使用 JS-303 验证组(参见 here), in conjunction with @Validated,来自文档:
Variant of JSR-303's Valid, supporting the specification of validation
groups.
例如:
@CheckEnumSize(groups = {Secondary.class})
public class CancelDto {
public CancelDto(List<String> items) {
this.items = items;
}
@NotNull(groups = {Primary.class})
@Size(min = 1)
public List<@NotNull String> items;
public CancellationTypeEnum cancelType;
public List<String> getItems() {
return items;
}
}
其中 Primary
是一个简单的接口:
public interface Primary {
}
Secondary
也是一样:
public interface Secondary {
}
最后你可以使用验证如下:
@Service
@Validated({Primary.class, Secondary.class})
public class CancelService {
public void applyCancel(@Valid CancelDto cancel) {
//TODO
}
}
将上述代码与 CancelDto
项一起使用时,您应该得到:
Caused by: javax.validation.ConstraintViolationException: applyCancel.cancel.items: must not be null
我有一个 DTO class,我在其中设置了一些必填字段。 并且,基于另一个类型字段,其中值可以假设为 A & B 如果类型A,只需要检查1项就可以通过,如果B,也可以多于1项。
我需要检查列表在 DTO class 级别是否至少有 1 个值。而且,在自定义注释验证中,我需要根据 DTO 的类型字段检查列表的大小。
因此,在 DTO 中
@NotNull
@Size(min = 1)
private List<@NotBlank String> items;
并且,内部注释
if (cancelType == CancellationTypeEnum.A && cancelDto.getItems().size() > 1) {
isValid = false;
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(
"Only one item can be sent for 'A' cancel type.").addConstraintViolation();
}
但是,由于字段级别稍后发生,如果我为 items 字段传递 null,它将转到此注释验证器并抛出 NPE,因为字段为 null & 我正在尝试获取大小
临时解决方案是我先检查 null,然后检查大小,但无论如何在字段级别我们都会提供 @NotNull。
有什么方法可以在字段级验证发生后执行 class 级自定义注释来验证。 在这种情况下,它将抛出字段级验证,因为字段为空并且不会转到自定义 class 级注释
您可以使用 JS-303 验证组(参见 here), in conjunction with @Validated,来自文档:
Variant of JSR-303's Valid, supporting the specification of validation groups.
例如:
@CheckEnumSize(groups = {Secondary.class})
public class CancelDto {
public CancelDto(List<String> items) {
this.items = items;
}
@NotNull(groups = {Primary.class})
@Size(min = 1)
public List<@NotNull String> items;
public CancellationTypeEnum cancelType;
public List<String> getItems() {
return items;
}
}
其中 Primary
是一个简单的接口:
public interface Primary {
}
Secondary
也是一样:
public interface Secondary {
}
最后你可以使用验证如下:
@Service
@Validated({Primary.class, Secondary.class})
public class CancelService {
public void applyCancel(@Valid CancelDto cancel) {
//TODO
}
}
将上述代码与 CancelDto
项一起使用时,您应该得到:
Caused by: javax.validation.ConstraintViolationException: applyCancel.cancel.items: must not be null