后端参数校验方式

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) {
    // 获取用户逻辑
}
相关推荐
zjw_rp2 分钟前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob15 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
向宇it32 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行34 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想2 小时前
JMeter 使用详解
java·jmeter
言、雲2 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇2 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
Yvemil72 小时前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java