一篇文章教你如何用Java自定义一个参数校验器

目录
  • 注解
  • 校验器
  • 异常处理
  • 测试
  • 总结

自定义一个唯一字段校验器

注解

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {IsUniqueValidator.class}) // 指定自定义的校验器
public @interface IsUnique {
    // 提示信息
    String message() default "";
    // 不加这俩参数 error msg: contains Constraint annotation, but does not contain a groups parameter.
    // 必须包含这两个参数
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    // -----
}

校验器

public class IsUniqueValidator implements ConstraintValidator<IsUnique, String> {
    @Override
    public void initialize(IsUnique constraintAnnotation) {
    }
    /**
     * 通过该方法,对参数进行验证,看是否通过。
     * @param value   修饰字段的值。
     * @param context 上下文
     * @return true:验证通过。 false:验证不通过。
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 模拟数据库判断是否存在改用户名
        return !"aaaa".equals(value);
    }
} 

异常处理

@ControllerAdvice
@ResponseBody
public class ValidatorExceptionHandler {
    @ExceptionHandler(value = BindException.class)
    public Map<String, String> exceptionHandler(BindException e) {
        List<ObjectError> allErrors = e.getAllErrors();
        StringBuilder sb = new StringBuilder();
        for (ObjectError error : allErrors) {
            sb.append(error.getDefaultMessage());
            sb.append(", ");
        }
        String error = sb.toString();
        HashMap<String, String> resp = new HashMap<>();
        resp.put("1004", error.substring(0, error.lastIndexOf(",")));
        return resp;
    }
}

使用, 跟spring提供的用法完全一致

@Data
public class User {
    @NotNull(message = "name不为null")
    @IsUnique(message = "用户名是唯一的")
    private String name;
    @NotNull
    private String password;
}
    @PostMapping
    public String hello(@RequestBody @Valid User user) {
        return "hello" + user.getName();
    }

测试

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java杂谈之如何消除代码中一大串参数列表

    目录 方法为何要有参数? 长参数列表的问题 解决方案 聚沙成塔 动静分离 告别标记 总结 有经验的程序员应该都见过,一个方法坐拥几十上百个参数. 方法为何要有参数? 因为不同方法间需共享信息. 但方法间共享信息的方式不止一种,除了参数列表,还有全局变量.但全局变量总能带来意外惊喜,所以,取消全局变量也是各大语言的趋势. 但方法之间还是要传递信息的,不能用全局变量,于是参数就成了唯一选择,于是,只要你想到有什么信息要传给一个方法,就会直接它加到参数列表中,参数列表也越来越长. 长参数列表的问题 参

  • Java程序命令行参数用法总结

    目录 基于命令行输入参数 基于命令行输入系统属性 JVM参数设置 环境变量 vs 系统属性 基于Maven命令运行Spring Boot应用 前言: 在命令行中输入可以输入各类参数,本文将针对这些参数做一个小结. 基于命令行输入参数 测试程序如下: import java.util.Arrays; public class Main { public static void main(String[] args) { System.out.println("System Property, ab

  • 解析Java的可变长参数列表及其使用时的注意点

    Java 可变参数列表 复制代码 代码如下: class A {} 由于所有的类都继承于Object,可以以Object数组为参数的方法: public class parameter { static void printArray(Object[] args){ for(Object obj : args){ System.out.print(obj + " "); } System.out.println(); } public static void main(String[]

  • java接口返回参数按照请求参数进行排序方式

    目录 java接口返回参数按照请求参数进行排序 排序 java通过接口进行排序 描述 知识点 1.Comparable接口 2.Comparator接口 java接口返回参数按照请求参数进行排序 在项目实际开发中可能遇到过这种问题,接口请求参数顺序是[a,b,c],结果返回的数据是[bObject,cObject,aObject],导致这种原因可能是底层采用了设计模式,或者是表拼接查询,本文主要就是为了实现这种功能,采用流的方法 代码实现 import lombok.Data; import j

  • Java可变参数列表详解

    Java可变参数列表详解 1.接受的传入参数情况: 如public void test(String ...args){...} 1)不使用参数,如test() 2)使用一个或多个参数,如test("1"); test("1","2"); 3)使用数组 test(new String[]{"1","2"}); 2.方法内部访问参数: 在test方法内部,我们可以像使用数组的访问方式一样来访问参数args.如

  • 一篇文章教你如何用Java自定义一个参数校验器

    目录 注解 校验器 异常处理 测试 总结 自定义一个唯一字段校验器 注解 @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = {IsUniqueValidator.class}) // 指定自定义的校验器 public @interface IsUnique { // 提示信息 String message() default "";

  • 一篇文章教带你了解Java Spring之自动装配

    目录 在Spring中有三种装配的方式: 1.Bean的自动装配 1.1 autowire="byName" 实现自动装配 1.2 autowire="byType" 实现自动装配 2.注解实现自动装配 2.1 配置注解 2.2 @Autowired注解 2.3 @Resource注解 2.4小结 3.介绍一个idea中做笔记的小技巧 总结 在Spring中有三种装配的方式: 在xml中显示的配置 在java中显示配置 隐式的自动装配bean 1.Bean的自动装配

  • 一篇文章教你如何用C语言实现strcpy和strlen

    目录 自己实现strcpy.strlen strcpy的实现 strlen的实现 总结 自己实现strcpy.strlen strcpy的实现 思路: 通过指针访问地址然后将要copy的文本逐一复制到目的地. void my_strcpy(char* dest, char* src){ while (*src !='\0'){ *dest = *src; src++; dest++; } *dest = *src; } //自己实现strcpy int main(){ char arr1[]="

  • 一篇文章教你如何用多种迭代写法实现二叉树遍历

    目录 思想 实现 总结 思想 利用栈和队列都可以实现树的迭代遍历.递归的写法将这个遍历的过程交给系统的堆栈去实现了,所以思想都是一样的.无非就是插入值的时机不一样.利用栈的先进先出的特点,对于前序遍历.我们可以先将当前的值放进结果集中,表示的是根节点的值.然后将当前的节点加入到栈中.当前的节点等于自己的left.再次循环的时候.也会将left作为新的节点.直到节点为空.也就是走到了树的最左边.然后回退.也就是弹栈..也可以认为回退的过程是从低向上的.具体就是让当前的节点等于栈弹出的right.继

  • 一篇文章教你简单使用Vue的watch侦听器

    目录 侦听器watch  格式 设置侦听器: 总结 侦听器watch  函数名就是要侦听的元素的名字 传入的参数第一个是变化后的新值newval,第二个是变化前的旧值oldval  格式 方法格式的侦听器 无法在刚进入页面时自动触发,只有在侦听到变化才会触发 如果侦听的是对象,当对象的属性发生变化时,不会侦听到 对象格式的侦听器 通过immediate选项,可以让侦听器自动触发 通过deep选项,使侦听器深度侦听到对象中属性的变化 这是Vue实例中的data对象: 设置侦听器: 下面分别是方法格

  • 一篇文章教你学会使用Python绘制甘特图

    目录 优点 局限 一日一书 用来制作甘特图的专业工具也不少,常见的有:Microsoft Office Project.GanttProject.WARCHART XGantt.jQuery.Gantt.Excel等,网络上也有一些优质工具支持在线绘制甘特图. 可是这种现成的工具,往往也存在一些弊端,让编程人员不知所措.比如说,花里胡哨的UI,让人目不暇接,不知点哪个才好: 比如说,有些基于浏览器的图表需要掌握HTML.JS等编程语言,只会点Python的我直接被劝退: 再比如,进来就是注册.登

  • 一篇文章带你搞懂Java线程池实现原理

    目录 1. 为什么要使用线程池 2. 线程池的使用 3. 线程池核心参数 4. 线程池工作原理 5. 线程池源码剖析 5.1 线程池的属性 5.2 线程池状态 5.3 execute源码 5.4 worker源码 5.5 runWorker源码 1. 为什么要使用线程池 使用线程池通常由以下两个原因: 频繁创建销毁线程需要消耗系统资源,使用线程池可以复用线程. 使用线程池可以更容易管理线程,线程池可以动态管理线程个数.具有阻塞队列.定时周期执行任务.环境隔离等. 2. 线程池的使用 /** *

  • 一篇文章教你使用SpringBoot如何实现定时任务

    前言 在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz,本文我们就来看下 Spring Boot 中两种定时任务的实现方式. 一.第一种方式:@Scheduled 使用 @Scheduled

  • 教你如何用Java替换Word中带有${}的内容

    一.概述 1.因为有些需求,需要把word文档里面的特定数据,设置成可变的:所以需要某种方式,把可变量用标签(如${变量名})替换,通过后端赋值此变量名,重新生成的Word就能根据后端设置的内容变化. 2.替换方法:准备一份word模板文档,如:word_mode.doc(或 word_mode.docx) 文件,把可变内容,用标签${变量名}替换(如图1姓名:${name}) 3.转成可读模板:全部设置完变量标签后,对此word文档进行另存为xml格式的文档(图2),保存后的文件名:word_

  • 教你如何用Java根据日期生成流水号

    前言 生成流水号,在企业中可以说是比较常见的需求,尤其是订单类业务. 一般来说,需要保证流水号的唯一性. 如果没有长度和字符的限制,那么直接使用UUID生成一个唯一字符串即可,也可以直接使用数据库表中的主键,主键就是唯一的. 那么,如果限制了流水号必须多少位,这种怎么生成呢? 可以采用"前缀+日期+数字"的方式(ps:此方式是需要用到缓存的) 前缀:为了更好的标识这个流水号是属于哪种类型: 日期:为了防止重复: 数字:为了表示当前的流水所处序号. 需求:生成一个17位数的唯一流水号,&

随机推荐