springboot日常开发参数校验注解

news/2025/1/15 13:53:19/

springboot日常开发参数校验注解

1. 常用的参数校验注解

2. 使用示例

3. 在Controller中使用

4. 全局异常处理

5. 自定义校验注解


🎈边走、边悟🎈迟早会好

在Spring Boot的日常开发中,常常使用参数校验注解来保证传入的数据符合业务逻辑或预期格式。Spring Boot内置了对JSR-303JSR-380标准的支持,主要依赖javax.validationHibernate Validator来进行参数校验。

1. 常用的参数校验注解

以下是Spring Boot常用的参数校验注解:

  • @NotNull: 字段不能为 null,适用于任何类型。
  • @NotEmpty: 字符串、集合、数组等不能为空(不允许 null 或空集合/数组等)。
  • @NotBlank: 只能用于字符串,字符串不能为 null,并且去掉空白字符后的长度必须大于0。
  • @Size: 校验字符串、集合、数组等的长度(或大小)。
    • 属性:minmax,例如:@Size(min=2, max=10)
  • @Min: 数字字段的最小值校验,适用于数值类型(IntegerLong等)。
  • @Max: 数字字段的最大值校验,适用于数值类型。
  • @Pattern: 校验字符串是否匹配指定的正则表达式。
    • 属性:regexp,例如:@Pattern(regexp="^[a-zA-Z0-9]+$")
  • @Email: 校验字符串是否是有效的邮箱格式。
  • @Past: 校验日期是否为过去的时间。
  • @Future: 校验日期是否为将来的时间。
  • @DecimalMin: 校验数值类型是否大于等于指定的值,适用于小数。
    • 属性:inclusive,指定是否允许等于这个值。
  • @DecimalMax: 校验数值类型是否小于等于指定的值,适用于小数。
  • @Positive: 校验数值是否为正数。
  • @Negative: 校验数值是否为负数。
  • @Digits: 校验数字的整数位和小数位的位数。
    • 属性:integerfraction,例如:@Digits(integer=3, fraction=2),表示整数最多3位,小数最多2位。

2. 使用示例

假设有一个用户注册的DTO类,可以使用参数校验注解来限制用户输入:

java">import javax.validation.constraints.*;public class UserRegistrationDTO {@NotBlank(message = "用户名不能为空")@Size(min = 3, max = 20, message = "用户名长度必须在3到20个字符之间")private String username;@NotBlank(message = "密码不能为空")@Size(min = 6, max = 100, message = "密码长度必须在6到100个字符之间")private String password;@NotBlank(message = "邮箱不能为空")@Email(message = "邮箱格式不正确")private String email;@Min(value = 18, message = "年龄必须大于等于18岁")@Max(value = 65, message = "年龄必须小于等于65岁")private Integer age;// Getters and Setters
}

3. 在Controller中使用

在Spring Boot的控制器中,配合@Valid@Validated注解,可以自动对请求中的参数进行校验:

java">import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;@RestController
@RequestMapping("/users")
public class UserController {@PostMapping("/register")public String registerUser(@Valid @RequestBody UserRegistrationDTO user) {// 如果参数校验失败,Spring会自动抛出异常,返回400错误return "注册成功";}
}

4. 全局异常处理

当参数校验失败时,Spring Boot会抛出一个MethodArgumentNotValidException异常,你可以通过全局异常处理器来捕获这个异常并自定义返回结果:

java">import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.validation.FieldError;import java.util.HashMap;
import java.util.Map;@RestControllerAdvice
public class GlobalExceptionHandler {@ResponseStatus(HttpStatus.BAD_REQUEST)@ExceptionHandler(MethodArgumentNotValidException.class)public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getAllErrors().forEach(error -> {String fieldName = ((FieldError) error).getField();String errorMessage = error.getDefaultMessage();errors.put(fieldName, errorMessage);});return errors;}
}

5. 自定义校验注解

如果内置注解不满足需求,还可以创建自定义校验注解:

  1. 定义注解:
java">import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Constraint(validatedBy = MyCustomValidator.class)
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomValidation {String message() default "自定义校验失败";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
  1. 实现校验逻辑:
java">import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class MyCustomValidator implements ConstraintValidator<MyCustomValidation, String> {@Overridepublic void initialize(MyCustomValidation constraintAnnotation) {}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 自定义校验逻辑return value != null && value.startsWith("custom_");}
}

这样你就可以在实体类上使用自定义注解了。

Spring Boot的参数校验机制强大灵活,能够帮助你在开发中减少手动编写校验代码。

 🌟感谢支持 听忆.-CSDN博客

🎈众口难调🎈从心就好


http://www.ppmy.cn/news/1521644.html

相关文章

css之雪碧图(精灵图)

听到雪碧图是不是跟我一样&#xff0c;啥&#xff1f;雪碧图&#xff1f;不知所以。 如果一张大图由许多小图构成&#xff0c;那么每张小图都需要进行网络请求&#xff0c;这样一来就会有很多请求&#xff0c;为了减少网络请求&#xff0c;雪碧图就出现了。 雪碧图&#xff0…

PCB散热设计

随着电子设备性能的不断提升&#xff0c;电路板上的元器件集成度越来越高&#xff0c;发热量也随之增加。如何有效管理这些热量&#xff0c;保证电路板在高温环境下的稳定运行&#xff0c;成为设计过程中一个不可忽视的问题。如果散热不佳&#xff0c;电子元件可能会因过热导致…

山东大学机试试题合集

&#x1f370;&#x1f370;&#x1f370;高分篇已经涵盖了绝大多数的机试考点&#xff0c;由于临近预推免&#xff0c;各校的机试蜂拥而至&#xff0c;我们接下来先更一些各高校机试题合集&#xff0c;算是对前边学习成果的深入学习&#xff0c;也是对我们代码能力的锻炼。加油…

C语言之联合体和枚举

目录 前言 一、联合体类型的声明 二、联合体的特点 三、联合体的大小计算 四、联合体的适用场景举例&#xff1a; 五、枚举类型的声明 六、枚举类型的优点 总结 前言 本文主要讲述C语言的两种结构类型&#xff1a;联合体和枚举。 ❤️感谢支持&#xff0c;点赞关注不迷路❤️ 一…

Flask wtforms组件的作用

Flask wtforms组件&#xff08;WTForms&#xff09;在Flask框架中扮演着至关重要的角色&#xff0c;其作用主要体现在表单验证和模板渲染两个方面。以下是对Flask wtforms组件作用的详细阐述&#xff1a; 一、表单验证 WTForms的主要功能之一是表单验证&#xff0c;即将用户提…

Leetcode面试经典150题-83.删除链表中的重复元素

解法都在代码里&#xff0c;不懂就留言或者私信 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val …

【学术会议征稿】2024年第十届机械制造技术与工程材料国际学术会议(ICMTEM 2024)

2024年第十届机械制造技术与工程材料国际学术会议&#xff08;ICMTEM 2024&#xff09; 2024 10th International Forum on Manufacturing Technology and Engineering Materials 第十届机械制造技术与工程材料国际学术会议&#xff08;ICMTEM 2024&#xff09;将于2024年10月…

HMI触屏网关-VISION如何与Modbus TCP从机通信

上文&#xff1a;HMI触屏网关-VISION如何与Modbus RTU从机通信-CSDN博客 1. 硬件连接 Modbus TCP协议采用网口通信的方式&#xff0c;因此&#xff0c;只需要保证网关的LAN口IP和Modbus TCP从机的IP在同一网段即可。 Modbus TCP从机参数说明&#xff1a; 2. VISION创建Modbu…