springmvc中使用@Valid注解进行参数验证

硅谷探秘者 4341 0 0

我在之前进行接口开发的时候经常会有大量的参数验证,而我一般的操作方法就是在controller中进行参数的校验,这样并没有什么错,但是代码略显臃肿,而使用springboot的@vaild注解可以减少不少代码量。

看一个例子,要求id,name,age都不能为空,而且年龄必须在1-100岁之间。

实体类:

package com.example.demo.entity;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
public class User {
	@NotNull(message = "id不能为空")
	private Integer id;
	@NotBlank(message = "姓名不能为空")
	private String name;
	@NotNull(message = "age不能为空")
	@Max(value = 100,message = "年龄不能超过100岁")
	@Min(value = 1,message = "年龄不能小于1岁")
	private Integer age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

看到上面的代码使用了一些注解,下面介绍一下注解的含义

1565441784310014888.png

实体类的规则我们写好了,下面是控制层方法代码

1.如果我们想一次性获取所有的参数验证是否满足条件并返回:

	@RequestMapping("test1")
	public AjaxResult test1(@Valid User user,Errors error) {
		if(error.hasErrors()) {
			List<FieldError> errorList = error.getFieldErrors();
			int s=errorList.size();
			String e[]=new String[s];
			for(int i=0;i<s;i++) {
				FieldError f=errorList.get(i);
				e[i]=f.getDefaultMessage();
			}
			return AjaxResult.fail(e);
		}
		return AjaxResult.success("ok");
	}

测试结果是:

image.png

image.png

2.如果希望只要有一个字段不符合条件就返回信息:

	@RequestMapping("test2")
	public AjaxResult test2(@Valid User user,BindingResult bindingResult) {
		if(bindingResult.hasErrors()) {
			return AjaxResult.fail(bindingResult.getFieldError().getDefaultMessage());
		}
		return AjaxResult.success("ok");
	}

测试结果:

image.png

image.png



自定义注解验证:

有时我们还会遇到一些验证比如验证银行卡号,身份证号等,那么就需要自定义注解验证了。

下面我们自定义一个注解简单模拟一些判断姓名必须为“jia”

自定义注解:

package com.example.demo.util;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidClass.class)
public @interface MyValid {
	String message() ;
	Class<?>[] groups() default { };
	Class<? extends Payload>[] payload() default { };
}

@Target和@Retention这两个原注解就不介绍了,看@Constraint这个注解,它表示我们判断逻辑的具体实现类是哪个类。

那么我们就定义一个判断逻辑的类:

package com.example.demo.util;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 * 自定义验证规则
 */
public class MyValidClass implements ConstraintValidator<MyValid, Object> {
	@Override
	public boolean isValid(Object value, ConstraintValidatorContext context) {
		String name = (String)value;
		if ("jia".equals(name)) {
			return true;
		}
		return false;
	}
}

那么在name字段中只需加@MyValid注解即可

        @NotBlank(message = "姓名不能为空")
	@MyValid(message="name的值必须为jia")
	private String name;

image.png

看返回结果可知,自定义注解验证生效。


评论区
请写下您的评论...
暂无评论...
猜你喜欢
框架 2546 失败统一返回给前端异常信息如何使考:http://www.jiajiajia.club/blog/artical/yjw520/248校需要的pom依赖
框架 5491 springmvc项目,如一个项目的页面调另一个项目的接口会产生跨域问题403。对于一个接口而言很好决跨域问题,springmvc只需要在接口上加一个。@CrossOrigin
工具 2300 javaweb图片码1.码的作:防止恶意破密码、刷票、论坛灌水、刷页。有效防止某个黑客对某一个特定特定程序暴力破方式不断的登录尝试,实际上使码是现在很多网站通的方
weblog 6101 java使easypoi导出excel时值替换如导出性别:据库储存的是字,1代表男,2代表女。导出的时候需要是汉字。在实体类使@Excel。 @Excel(name="性别
框架 2022 呢?首先我们有一个基础的配置类BasePage,这个类里面只有page,limit,index这三个属性,我们在创建其他查询封装类的时候要继承BasePage这个类。然后我们自己实现的
框架 3906 springaop实现操作日志记录此次的目的是实现对controller的方法执情况记录,记录的有方法执时间,操作人,请求的路径,方法的入,模块,功能等。并实现利的方式实现对被操作
java基础 3647 法已经过时了。(当方法或是类上面有@Deprecated时,说明该方法或是类都已经过期不能再,但不影响以前项目使,提醒你新替代待的方法或是类。如果程序员不小心使了它的元素,那么编译器会发出警告
weblog 2122 pom依赖!--https://mvnrepository.com/artifact/com.alibaba/fastjson-- dependency groupIdcom.alibaba/groupId artifactIdfastjson/artifactId version1.2.62/version /dependency后端代码 publicsynchronizedvoidm
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1 2024-08  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。