自学内容网 自学内容网

spring:参数校验

前言

后端初学者,写的内容只是当作自己的一个复习笔记,里面肯定有错误。目前只记录现阶段自己需要用到的内容

参数校验

在Spring Boot项目中,参数校验是非常重要的,它可以帮助我们确保传入的数据是有效的,从而提高系统的健壮性和安全性。下面将介绍几种常见的校验入参的方法。

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

1. 使用 @Valid@Validated 注解

这是最常用的方式,通过在方法参数上使用 @Valid@Validated 注解来触发数据校验。你需要在你的实体类或DTO(Data Transfer Object)中定义校验规则,比如:

public class User {
    @NotNull(message = "用户名不能为空")
    private String username;

    @Email(message = "邮箱格式不正确")
    private String email;

    // getters and setters
}

然后,在控制器中,你可以这样使用:

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public ResponseEntity<String> createUser(@Valid @RequestBody User user) {
        // 处理业务逻辑
        return ResponseEntity.ok("User created");
    }
}

2. 定制错误处理

当参数校验失败时,Spring Boot 默认会返回一个400 Bad Request的HTTP响应,并且包含错误信息。如果你想要定制错误消息或者响应码,可以实现 ControllerAdvice 来捕获 MethodArgumentNotValidException 异常并进行自定义处理。

import com.onion.boot3management.results.Result;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {

    // 处理 @Valid 注解导致的参数校验异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result 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);  // 将字段名和错误信息存入 Map
        });
        return  Result.error(errors.toString());
    }
}

3. 参数级别的校验

除了对整个对象进行校验外,你还可以对单个参数进行校验。例如:

@GetMapping("/{id}")
public ResponseEntity<User> getUserById(
        @PathVariable @Min(value = 1, message = "ID 必须为正整数") Long id) {
    // 查找用户并返回
}

4. 自定义校验注解

如果内置的校验注解无法满足需求,你可以创建自己的校验注解。首先定义一个注解:

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomValidator.class)
public @interface ValidMyCustom {
    String message() default "Invalid value";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

然后编写对应的校验器:

public class MyCustomValidator implements ConstraintValidator<ValidMyCustom, String> {
    @Override
    public void initialize(ValidMyCustom constraintAnnotation) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 实现校验逻辑
        return true; // 返回true表示验证通过
    }
}

最后,在需要校验的地方使用这个自定义注解。

5. 组合校验

有时候你可能希望某些字段只在特定条件下进行校验,这时你可以使用分组校验功能。通过指定不同的校验组,可以在不同场景下启用不同的校验规则。

public class SuperuserParam {
    @Null(groups = Create.class, message = "用户ID必须为空")
    @NotNull(groups = Update.class, message = "用户ID不能为空")
    @Schema(description = "用户ID")
    // 使用雪花算法生成id
    @TableId(type = IdType.ASSIGN_ID)
    private Integer id;

    @NotBlank(message = "用户code不能为空")
    @Schema(description = "用户code")
    private String code;

    @NotBlank(message = "用户名称不能为空")
    @Schema(description = "用户名称")
    private String name;

    @NotBlank(message = "用户密码不能为空")
    @Schema(description = "用户密码")
    private String password;

    @Email(message = "邮箱格式不正确")
    @NotNull(message = "邮箱不能为空")
    @Schema(description = "邮箱")
    private String email;

    // 新增、修改参数校验组
    public interface Create extends Default {
    }

    public interface Update extends Default {
    }
}

// 控制器中指定使用哪个校验组
 @PostMapping("/addSuperUser")
 @ResponseBody
 public Result addOrUpdateSuperUser(@Validated(SuperuserParam.Create.class) @Valid @RequestBody SuperuserParam param) {
     return userService.addOrUpdateSuperUser(param);
 }

 // 修改管理员
 @PostMapping("/updateSuperUser")
 @ResponseBody
 public Result updateSuperUser(@Validated(SuperuserParam.Update.class) @Valid @RequestBody SuperuserParam param) {
     return userService.addOrUpdateSuperUser(param);
 }

原文地址:https://blog.csdn.net/weixin_41897680/article/details/144307845

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!