后端参数校验方式

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) {
    // 获取用户逻辑
}
相关推荐
tekin17 分钟前
Go、Java、Python、C/C++、PHP、Rust 语言全方位对比分析
java·c++·golang·编程语言对比·python 语言·php 语言·编程适用场景
李长渊哦1 小时前
Java 虚拟机(JVM)方法区详解
java·开发语言·jvm
陌殇殇2 小时前
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
java·spring cloud·微服务
猎人everest3 小时前
SpringBoot应用开发入门
java·spring boot·后端
山猪打不过家猪5 小时前
ASP.NET Core Clean Architecture
java·数据库·asp.net
AllowM5 小时前
【LeetCode Hot100】除自身以外数组的乘积|左右乘积列表,Java实现!图解+代码,小白也能秒懂!
java·算法·leetcode
不会Hello World的小苗6 小时前
Java——列表(List)
java·python·list
二十七剑7 小时前
jvm中各个参数的理解
java·jvm
东阳马生架构8 小时前
JUC并发—9.并发安全集合四
java·juc并发·并发安全的集合
计算机小白一个9 小时前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯