如何在Spring非响应式RouterFunction中使用@Valid进行Bean校验
在Spring MVC RouterFunction中实现Bean校验(等效于@Valid)
1. 确保引入校验依赖
首先确认项目中已加入Bean Validation的依赖,Spring Boot项目可以直接引入:
Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 在Handler中注入Validator并执行校验
无需自定义校验器,直接使用Jakarta Bean Validation提供的Validator接口,通过构造注入到PersonHandler中,然后在处理请求时对Person对象执行校验:
@Service public class PersonHandler { private final Validator validator; // 构造注入Validator public PersonHandler(Validator validator) { this.validator = validator; } public ServerResponse createPerson(ServerRequest request) { // 从请求中获取Person对象 Person person = request.body(Person.class); // 执行校验 Set<ConstraintViolation<Person>> violations = validator.validate(person); // 处理校验失败的情况 if (!violations.isEmpty()) { List<String> errorMessages = violations.stream() .map(ConstraintViolation::getMessage) .collect(Collectors.toList()); return ServerResponse.badRequest().body(errorMessages); } // 校验通过,执行业务逻辑 return ServerResponse.ok().body("Person created successfully"); } }
3. 路由配置保持不变
你的RouterFunctionService无需修改,原配置即可正常工作:
@Service public class RouterFunctionService { @Bean public RouterFunction<ServerResponse> question(PersonHandler handler) { return RouterFunctions.route() .POST("/person", handler::createPerson) .build(); } }
说明
这种方式完全等效于Spring MVC控制器中的@Valid注解:
- 基于你在
Person类上标记的@NotNull、@Size、@NotBlank等注解自动执行校验 - 无需编写自定义校验器,直接复用Jakarta Bean Validation的标准实现
- 校验失败时可以收集错误信息并返回400 Bad Request响应,和MVC的默认校验行为一致
内容的提问来源于stack exchange,提问作者user30457318
相关产品推荐
相关产品推荐

