后端参数校验方式

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) {
    // 获取用户逻辑
}
后端对前端传入数据进行参数校验,限定参数只能为男或女,可以使用自定义注解的方式来实现。 ### 自定义注解 首先创建一个自定义注解,用于标记需要进行校验的字段: ```java import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Target({FIELD}) @Retention(RUNTIME) @Documented @Constraint(validatedBy = GenderValidator.class) public @interface Gender { String message() default "性别只能为男或女"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` ### 自定义校验器 创建一个实现 `ConstraintValidator` 接口的校验器类: ```java import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class GenderValidator implements ConstraintValidator<Gender, String> { @Override public void initialize(Gender constraintAnnotation) { } @Override public boolean isValid(String value, ConstraintValidatorContext context) { return value != null && ("男".equals(value) || "女".equals(value)); } } ``` ### 使用自定义注解 在需要校验的实体类字段上使用自定义注解: ```java import javax.validation.constraints.NotNull; public class User { @NotNull private String name; @Gender private String gender; // getter 和 setter 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } } ``` ### 控制器中进行校验 在控制器方法中使用 `@Valid` 注解触发校验: ```java import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; @RestController public class UserController { @PostMapping("/users") public String createUser(@Valid @RequestBody User user, BindingResult result) { if (result.hasErrors()) { return result.getFieldErrors().get(0).getDefaultMessage(); } return "success"; } } ``` ### 代码解释 - 自定义注解 `@Gender` 用于标记需要校验的字段。 - `GenderValidator` 类实现了 `ConstraintValidator` 接口,用于具体的校验逻辑。 - 在 `User` 类的 `gender` 字段上使用 `@Gender` 注解进行标记。 - 在 `UserController` 的 `createUser` 方法中,使用 `@Valid` 注解触发校验,如果校验不通过,返回错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leighteen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值