java - 扩展默认的验证组默认不被验证
问题描述
我有以下验证组:
public class ValidationGroups {
public interface Create extends Default {}
public interface Update extends Default {}
}
我的注释实体:
public class Usuario implements UserDetails {
@NotNull(groups = { Update.class })
@NotBlank(groups = { Update.class })
@Length(max = 255, groups = { Update.class })
private String name;
@NotNull @NotEmpty @Email
private String email;
}
但是当我尝试使用默认验证来验证我的实体时,该字段name
根本没有经过验证,即使它是显式扩展的组Default
(使用注释@Valid
也会这样做):
@PostMapping("signup")
public String createUser(@Validated User user,
BindingResult result, Model model, RedirectAttributes redirectAttributes) {
我可以验证所有字段的唯一方法是在 @Validated 注释中显式添加 Default 组,如下所示:
@PostMapping("signup")
public String createUser(@Validated({ Default.class, Update.class }) User user,
BindingResult result, Model model, RedirectAttributes redirectAttributes) {
Default
当没有指定组时,默认情况下不应该验证所有带有扩展组注释的字段吗?
解决方案
我今天遇到了类似的问题,所以这可能会在将来对其他人有所帮助 - 默认关系以相反的方式工作,如下所述: JSR303 验证组继承
当您使用@Validated(Update.class)
时,应用的验证是属于 Update.class 及其所有继承链的验证,因此在这种情况下,Update.class 和 Default.class 都将适用。
您正在尝试做的是相反的方式,即保持@Valid 为所有验证组工作。为此,您需要为您的班级重新定义 Default 组:
@GroupSequence({Usuario.class, Update.class})
public class Usuario implements UserDetails
这将允许 @Valid 应用所有验证。
推荐阅读
- vue.js - 从点击事件设置 mapbox-gl 标记会导致奇怪的工件出现在 VueJS 的地图上
- javascript - 获取数组内的对象值/状态之一
- javascript - Joi验证数组的顺序
- python - Python Lambda 函数中断且未在 CloudWatch 中记录错误
- php - 使用PHP格式化SQL查询结果横向显示
- instagram - Instagram 的新标签端点返回了多少帖子(文档未指定)?
- javascript - 使用 Nightwatch/Cucumber 实现无头 e2e 测试时,React-router 似乎没有呈现下一页
- c++ - SDL libsdl1.2-dev
- c# - Unity3d 可视化脚本框架如何在幕后工作?
- kubernetes - 通配符让我们在 kubernetes 中使用 cert-manager、nginx 入口、cloudflare 加密证书如何修复?