java - 如何在 Spring 验证器中拒绝 List 中的无效值?
问题描述
我收到从JSON
客户端请求正文反序列化的域对象 ID 列表:
@JsonProperty("workgroups")
private List<WorkgroupId> workgroupIds = new ArrayList<>();
我需要在org.springframework.validation.Validator
.
for (WorkgroupId workgroupId : project.getWorkgroupIds()) {
if (!domainObjectTools.doesWorkgroupExist(workgroupId)) {
// reject this invalid value here...
}
}
问题
如何拒绝无效值org.springframework.validation.Errors
?
解决方案
验证器接口:
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { CustomValidatorValidator.class })
@Documented
public @interface CustomValidator{
String message() default "Put here your default message";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
验证器实现:
public final class CustomValidatorValidator implements ConstraintValidator<CustomValidator, List<WorkgroupId>> {
@Override
public void initialize(CustomValidator constraintAnnotation) {
}
@Override
public boolean isValid(List<WorkgroupId> yourlist, ConstraintValidatorContext context) {
if (yourlist== null)
return true;
else
return yourlist.stream().anyMatch(s -> /* filter here as you want */);
}
}
请注意,如果字段为空,我们将返回true
,我这样做是因为@NotNull
如果我不需要为空,我只是放置约束,因此我可以更好地控制约束。
最后:
@JsonProperty("workgroups")
@CustomValidator
private List<WorkgroupId> workgroupIds = new ArrayList<>();
PS:我不明白你为什么在最后一个代码中初始化列表。如果这是您应该通过请求接收的字段,那么您不需要初始化它,json 反序列化器将使用 json 中的传入字段对其进行初始化。
推荐阅读
- qnx - 如何在 qnx 6.4.1 中安装 rsync?
- reactjs - useCallback 在 ReactJS 中包装一个简单的函数
- .net - WebView2:我必须安装 Microsoft.Web.WebView2.DevToolsProtocolExtension 吗?
- spring-boot - Spring Boot 谷歌搜索结果
- javascript - 在 react js 中进行单元测试时,有没有办法改变 props 值?
- apache - 服务器证书不包含与 apache 中的服务器名称匹配的 ID
- tableau-api - 如何在 Tableau 计算字段中使用 case 语句计算平均值?
- c - C 链表中的哨兵节点
- docker - 优化 dockerfile 图像大小。还有什么以及如何减小此图像的大小?
- google-chrome - chrome在表格中搜索多个词返回结果