返回

Spring Boot 使用 @RequestParam 注解轻松搞定数据校验

后端

数据校验利器:@RequestParam 助力 Spring Boot 开发

在 Spring Boot 中,处理请求参数是开发中必不可少的一部分。@RequestParam 注解 作为 Spring 提供的强大工具,简化了这一过程,让我们轻松实现数据校验,提高应用程序的健壮性和用户体验。

一、基本用法

使用 @RequestParam 注解,只需在方法参数前加上它,即可获取请求参数的值。例如,以下代码获取请求参数 "id":

@GetMapping("/user/{id}")
public User getUserById(@RequestParam Long id) {
    return userService.findById(id);
}

若请求参数未包含,默认为必填,系统会抛出异常。

二、可选参数

若允许请求参数可选,可通过 @RequestParam 的 required 属性设置为 false,例如:

@GetMapping("/user")
public List<User> getUsers(@RequestParam(required = false) String status) {
    return userService.findByStatus(status);
}

当请求参数不存在时,参数值为 null

三、自定义错误消息

默认情况下,参数无效时会抛出异常,显示默认错误消息。使用 @RequestParam 的 message 属性,可自定义错误消息。例如:

@GetMapping("/user/{id}")
public User getUserById(@RequestParam(message = "用户 ID 不能为空") Long id) {
    return userService.findById(id);
}

参数无效时,会抛出异常并显示 "用户 ID 不能为空" 的错误消息。

四、异常处理

除抛出异常外,还可通过 @ExceptionHandler 注解 处理异常。例如,处理 MissingServletRequestParameterException

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public ResponseEntity<Object> handleMissingServletRequestParameterException(MissingServletRequestParameterException ex) {
        return ResponseEntity.badRequest().body("缺少请求参数: " + ex.getParameterName());
    }
}

参数无效时,返回 400 状态码和 "缺少请求参数: [参数名]" 的错误消息。

五、代码示例

以下代码展示了使用 @RequestParam 注解验证请求参数的完整示例:

@GetMapping("/user/{id}")
public User getUserById(@RequestParam(required = false, message = "用户 ID 不能为空") Long id) {
    if (id == null) {
        throw new IllegalArgumentException("用户 ID 不能为空");
    }
    return userService.findById(id);
}

六、常见问题解答

1. 如何设置默认值?

使用 @RequestParam 的 defaultValue 属性,例如:

@RequestParam(defaultValue = "0") int page

2. 如何验证枚举值?

使用自定义注解,例如:

public @interface ValidEnum {
    Class<? extends Enum<?>> enumClass();
    String message() default "无效的枚举值";
}

@ValidEnum(enumClass = Status.class, message = "无效的状态值")
public enum Status { ... }

在参数前使用该注解即可。

3. 如何同时验证多个参数?

使用 @Valid 注解,对一个对象进行整体验证,例如:

public class UserRequest {
    private Long id;
    private String name;
}

@PostMapping("/user")
public User createUser(@RequestBody @Valid UserRequest request) { ... }

4. 如何处理类型转换异常?

若参数类型与请求参数类型不匹配,可使用 @NumberFormat 注解指定数字格式,或使用 @RequestParam(converter = MyConverter.class) 指定自定义转换器。

5. 如何验证文件上传?

使用 Spring Web 的 MultipartFile,例如:

@PostMapping("/upload")
public void uploadFile(@RequestParam("file") MultipartFile file) { ... }

总结

Spring Boot 的 @RequestParam 注解 为数据校验提供了强大的功能,使开发人员能够轻松处理请求参数,提高应用程序的健壮性和用户体验。通过设置 requireddefaultValuemessage 等属性,可以灵活定制验证规则,满足不同的业务需求。