You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:06:10