在 spring boot 中实现参数自动校验主要依靠 java bean validation api(jsr 380)和 spring 的集成支持。以下是详细实现步骤:
1. 添加依赖
在 pom.xml
中添加验证依赖:
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-validation</artifactid> </dependency>
2. 在实体类/dto中添加校验注解
使用注解标记需要校验的字段:
public class userdto { @notblank(message = "用户名不能为空") private string username; @email(message = "邮箱格式不正确") private string email; @min(value = 18, message = "年龄必须大于18岁") private int age; @pattern(regexp = "1[3-9]\\d{9}", message = "手机号格式不正确") private string phone; // getter/setter省略 }
常用校验注解:
@notnull
:非 null@notblank
:非空(字符串)@notempty
:非空集合/数组@min
/@max
:数值范围@size
:长度范围@email
:邮箱格式@pattern
:正则表达式
3. 在controller中使用校验
在接收参数的请求方法中添加 @valid
或 @validated
:
@postmapping("/create") public responseentity<?> createuser(@valid @requestbody userdto userdto) { // 校验通过后执行业务逻辑 return responseentity.ok("用户创建成功"); }
注意:
@valid
是标准 jsr 注解,@validated
是 spring 的增强版(支持分组校验)。
4. 处理校验异常
添加全局异常处理器捕获校验失败异常:
@restcontrolleradvice public class globalexceptionhandler { @exceptionhandler(methodargumentnotvalidexception.class) public responseentity<map<string, string>> handlevalidationexception(methodargumentnotvalidexception ex) { map<string, string> errors = new hashmap<>(); ex.getbindingresult().getfielderrors().foreach(error -> { errors.put(error.getfield(), error.getdefaultmessage()); }); return responseentity.status(httpstatus.bad_request).body(errors); } }
响应示例:
{ "username": "用户名不能为空", "email": "邮箱格式不正确" }
5. 进阶用法
分组校验(不同场景不同规则)
定义分组接口:
public interface creategroup {} public interface updategroup {}
在 dto 中指定分组:
public class userdto { @notnull(groups = updategroup.class, message = "id不能为空") private long id; @notblank(groups = {creategroup.class, updategroup.class}) private string name; }
controller 指定分组:
@postmapping("/update") public void updateuser(@validated(updategroup.class) @requestbody userdto dto) { // ... }
自定义校验注解
创建自定义注解:
@target({field}) @retention(runtime) @constraint(validatedby = phonevalidator.class) public @interface validphone { string message() default "手机号格式错误"; class<?>[] groups() default {}; class<? extends payload>[] payload() default {}; }
实现校验逻辑:
public class phonevalidator implements constraintvalidator<validphone, string> { @override public boolean isvalid(string phone, constraintvalidatorcontext context) { return phone != null && phone.matches("1[3-9]\\d{9}"); } }
6. 测试校验
使用 postman 或 curl 发送无效请求:
curl -x post http://localhost:8080/create \ -h "content-type: application/json" \ -d '{"username":"", "email":"invalid-email"}'
将返回:
{ "username": "用户名不能为空", "email": "邮箱格式不正确" }
总结流程:
graph td a[添加依赖] --> b[dto添加校验注解] b --> c[controller添加@valid] c --> d[全局异常处理器] d --> e[返回错误信息]
通过以上步骤,spring boot 会自动完成参数校验,无需手动编写校验逻辑,大幅提升开发效率。
到此这篇关于spring boot 自动参数校验的文章就介绍到这了,更多相关spring boot 自动参数校验内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论