后端参数校验方式

1. 使用Hibernate Validator进行注解校验

这是Java中最常用 的参数校验方式,基于JSR 303/JSR 380规范的实现,通常结合@Valid@Validated注解进行参数校验。

使用步骤:

  • 添加依赖(如果使用Spring Boot,通常已经内置了Hibernate Validator):

    <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
  • 在DTO类中使用校验注解:

    public class UserDTO {

    复制代码
      @NotNull(message = "用户名不能为空")
      @Size(min = 3, max = 20, message = "用户名长度必须在3到20之间")
      private String username;
    
      @Email(message = "邮箱格式不正确")
      private String email;
    
      // 其他字段和getter/setter

    }

  • 在Controller中使用@Valid@Validated来触发校验:

    @PostMapping("/user")
    public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO) {
    // 如果校验失败,会自动抛出异常
    return ResponseEntity.ok("用户创建成功");
    }

  • 如果需要自定义异常处理,可以在全局异常处理器中处理MethodArgumentNotValidException

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<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 ResponseEntity.badRequest().body(errors);
    }

2. 手动校验

对于复杂的业务逻辑,可能需要手动编写校验逻辑。可以通过Java代码在Controller或Service层进行参数的业务校验。

复制代码
if (userDTO.getUsername() == null || userDTO.getUsername().length() < 3) {
    throw new IllegalArgumentException("用户名长度必须大于3");
}

3. 自定义注解

如果Hibernate Validator内置的注解不能满足需求,可以自定义校验注解。比如,创建一个自定义注解来验证某个字段是否满足自定义规则。

自定义注解示例:

  • 创建注解:

    @Target({ ElementType.FIELD, ElementType.PARAMETER })
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = CustomValidator.class)
    public @interface CustomConstraint {
    String message() default "默认错误信息";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    }

  • 创建校验逻辑:

    public class CustomValidator implements ConstraintValidator<CustomConstraint, String> {

    复制代码
      @Override
      public void initialize(CustomConstraint constraintAnnotation) {
      }
    
      @Override
      public boolean isValid(String value, ConstraintValidatorContext context) {
          // 自定义校验逻辑
          return value != null && value.startsWith("A");
      }

    }

  • 在DTO类中使用自定义注解:

    public class UserDTO {
    @CustomConstraint(message = "用户名必须以A开头")
    private String username;
    }

4. Spring的 @RequestParam****和 @PathVariable****校验

对于简单的请求参数,可以在方法参数中使用@RequestParam@PathVariable结合Hibernate Validator注解进行校验。

复制代码
@GetMapping("/user/{id}")
public ResponseEntity<UserDTO> getUser(
        @PathVariable @NotNull(message = "用户ID不能为空") Long id) {
    // 获取用户逻辑
}
相关推荐
ChinaRainbowSea2 分钟前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·后端·spring
KiddoStone12 分钟前
多实例schedule job同步数据流的数据一致性设计和实现方案
java
岁忧33 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
YuTaoShao36 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干2 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying2 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠3 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github