springboot~自定义valid及DefaultGroupSequenceProvider的作用
spring一切都可以基于注解来实例,像缓存,校验,字段映射,动态代理等等,今天主要说一下自定义的校验及校验的组关联。
- 自定义注解,判断name需要以"管理员"结尾
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PrefixAdminValidator.class)
@Documented
public @interface PrefixAdmin {
String message() default "必须以'角色'结尾";
//这两个属性必须有
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Component
public class PrefixAdminValidator implements ConstraintValidator<PrefixAdmin, String> {
@Override
public void initialize(PrefixAdmin constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value.endsWith("角色");
}
}
- 然后有个需求,只有字段manager为true时,才进行PrefixAdminValidator的校验,这时我们可以通过DefaultGroupSequenceProvider组依赖来实现
/**
* 校验的依赖,当isManager为true为,PrefixAdmin注解才有效.
*/
public class RoleProvider implements DefaultGroupSequenceProvider<RoleDTO> {
@Override
public List<Class<?>> getValidationGroups(RoleDTO object) {
List<Class<?>> defaultGroupSequence = new ArrayList<>();
defaultGroupSequence.add(RoleDTO.class); //注意这里不要写错
if (object != null && object.isManager()) {
defaultGroupSequence.add(RoleDTO.CheckManagerGroup.class);
}
return defaultGroupSequence;
}
}
- 实体在字段上添加对接的注解
@Data
@GroupSequenceProvider(RoleProvider.class)
@ApiModel("角色DTO")
public class RoleDTO {
private String id;
@PrefixAdmin(groups = CheckManagerGroup.class)
private String name;
private boolean manager;
public interface CheckManagerGroup {
}
}
- 控制器请求体添加@Valid
@ApiOperation("新增")
@PostMapping("add")
@Transactional(rollbackFor = Exception.class)
public CommonResult add(@Valid @RequestBody RoleDTO roleDTO) {
if (roleDao.selectOne(new QueryWrapper<Role>().lambda().eq(Role::getName, roleDTO.getName())) != null) {
return CommonResult.clientFailure(String.format("%s已经存在", roleDTO.getName()));
}
Role role = new Role();
CopyUtils.copyProperties(roleDTO, role);
roleDao.insert(role);
updateRolePermissions(roleDTO.getPermissionIdList(), role);
return CommonResult.ok();
}
- 测试数据
- 结果响应
{
"code": 400,
"message": "name必须以'角色'结尾",
"data": null
}
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2021-04-27 docker~添加hosts绑定的方法
2019-04-27 dev和master合并冲突解决
2018-04-27 java~IDEA引用包时分组所有java包
2017-04-27 基础才是重中之重~关于ThreadStatic和Quartz的一点渊源
2016-04-27 知方可补不足~SqlServer自动备份数据库及清理备份文件
2015-04-27 MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动
2012-04-27 架构,改善程序复用性的设计~第一讲 系统的复用性离不开系统的面向对象性