[spring-projects/spring-boot]@Valid 注释不适用于 Spring Boot 2 (webFlux) 2.0.1.RELEASE

2024-04-23 178 views
9

我们有一些典型的restulApi,如下所示:

Mono<Void> apiMethod(@Valid @RequestBody Mono<Request> requestMono)
{
//....
}

public Class Request{
@NotNull
private String id;
...
}

但我发现验证注释不再起作用。具有 null id 的无效请求仍将传递给内部方法。

不确定这是否是一个错误,或者我是否错过了 Spring Boot 2 的任何内容。

谢谢

回答

2

感谢您联系,但感觉这个问题更适合StackOverflow。正如贡献指南中提到的,我们更喜欢仅使用 GitHub 问题来解决错误和增强功能。请随意更新此问题,并提供重新发布的问题的链接(以便其他人可以找到它),或者如果您认为这是一个真正的错误,则添加更多详细信息。

9

好吧,我发现注释应该添加在 Mono/Flux 中,例如Mono<@Valid Request>......

它有效,但我确实相信随着越来越多的人使用 webflux,这可能是一个改进的增强功能。

3

@Valid由于缺乏依赖而不起作用,以下操作可以使@Valid生效:

<dependency>
       <groupId>org.glassfish</groupId>
       <artifactId>javax.el</artifactId>
       <version>3.0.1-b09</version>
</dependency>

您还可以添加以下依赖项:

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

但是,spring-boot-starter-validation 包含 spring-web。您可以将 javax.el 添加到 spring-boot-starter-webflux 吗? @bclozel

2

这曾经被修复过吗?我使用的是 Spring boot 2.0.6 版本,@valid 注释不起作用。

4

@meetshahblogs 请花点时间阅读您正在评论的问题。这是我们重定向到 StackOverflow 的问题。我建议你这样做。如果您认为自己在 Spring Boot 中发现了错误(此处没有任何迹象表明如此),请使用我们可以自己运行的示例创建一个单独的问题(zip 或存储库链接)。

9

那么解决办法是什么呢?我遇到了同样的问题,在 StackOverflow 或 google @snicoll @bclozel 中找不到任何好的解决方案

0

@bclozel

尽管文档中提到了这一点,但 Bean 验证似乎不起作用。我请求考虑并重新讨论这个问题

5

@abhi2495 如果没有证据表明它不起作用,重新打开这个问题是没有意义的。如果验证对您不起作用,我怀疑那是因为您spring-boot-starter-validation的类路径上没有验证。如果您确实具备了必要的依赖项,但它仍然无法正常工作,那么我们可以花一些时间进行调查,但在此之前,您必须花一些时间提供一个完整但最小的示例来重现问题。您可以通过将其推送到 GitHub 上的单独存储库或将其压缩并附加到此问题来与我们共享。

8

@wilkinsona @bclozel 这是一个示例:https://github.com/abhi2495/demo-svc 我不知道我在这里错过了什么或做错了什么。如果您能调查一下,我将不胜感激。

4

感谢您提供示例,@abhi2495。

第一个问题是您没有必要的验证依赖项。正如我上面所建议的,添加它们的推荐方法是使用spring-boot-starter-validation

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

请注意,我必须在此处指定版本,因为您没有使用 Spring Boot 的依赖项管理。我们建议您将其用作Mavenspring-boot-starter-parent项目的父项目。这样做将允许您删除<version>此依赖项和其他几个依赖项,从而更轻松地保持所有版本同步。

第二个问题是你没有对EmployeeContract单声道做任何事情。使用 WebFlux 时,仅在需要时才执行处理。除非您尝试访问,否则EmployeeContract不会执行任何验证。如果您发出没有姓名和年龄的 POST 请求,并且将控制器方法更改为如下所示,您将收到 400 响应:

@PostMapping("/api/employee")
public Mono<ResponseEntity<String>> save(@Valid @RequestBody Mono<EmployeeContract> employeeMono) {
    return employeeMono.map((employee) -> ResponseEntity.ok(employee.getName()));
}
6

感谢@wilkinsona 指出这一点。我的错。我忘记了整个单声道的事情,它们在需要时才被处理。

5

@wilkinsona,这意味着仅当按照示例中的评论中的建议处理请求正文时,才会发生单类型的请求正文验证。与没有 mono 的请求主体的情况不同,验证甚至在处理之前执行。