如何使用 REST Easy 和 Vertx 启用 @Valid 注释

Posted

技术标签:

【中文标题】如何使用 REST Easy 和 Vertx 启用 @Valid 注释【英文标题】:How to enable @Valid annotation with REST Easy and Vertx 【发布时间】:2021-09-23 07:36:46 【问题描述】:

我正在尝试让 @Valid 注释在使用 RESTEasy 和 Vert.x 的项目中工作。

我有一个 API 控制器设置,其方法签名类似于 public Future<SomeResponseDto> someController(@Valid SomeRequestDto dto),其中 SomeRequestDto 如下所示:

@Value
public class SomeRequestDto 

  @NotEmpty
  String someField;
  
  @JsonCreator
  public SomeRequestDto(@JsonProperty("some_field") String someField) 
    this.someField = someField;
  
  

我的期望是,当我使用一些不符合验证条件的 JSON(即 someField"")调用 someController 时,会返回一个错误,并且不会执行 someController 的正文。情况并非如此,someController 的主体正在被执行。

有趣的是,如果我在 someController 的正文中进行手动验证,我会得到一个包含我期望的验证错误的 Set。手动验证使用以下代码:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

final var result = validator.validate(dto); // This holds the expected constraint validation error

在依赖方面,我的项目直接依赖如下(列在build.gradle):

org.jboss.resteasy:resteasy-validator-provider-11:3.0.11.Final
| org.hibernate:hibernate-validation:5.0.1.Final // Pulled in via the above

并且依赖于以下传递(通过依赖的依赖):

org.jboss.resteasy:resteasy-vertx:4.5.3.Final
| org.jboss.resteasy:resteasy-client:4.5.3.Final // Pulled in as a dependency of the above transient depdency

注意:| 表示子依赖(依赖的依赖或传递依赖的依赖)。

最后,我尝试按照here 列出的说明进行操作,但无济于事(希望添加validation.xml,因为我认为这不是必需的)。任何帮助将不胜感激!

【问题讨论】:

你试过用 resteasy-reactive 代替吗? @JavierToja 不!不幸的是,正弦resteasy-vertx 是我们必须使用的依赖项的依赖项,我认为我们在这里别无选择。 真的,我的错。 您使用的org.jboss.resteasy:resteasy-validator-provider-11 版本比resteasy-vertx 旧得多。这可能是问题所在。 FWIW 工件 ID 已更改为 resteasy-validator-provider,因此您也需要更改它。 是的。它们都是同一个项目的一部分,虽然它们可能使用不同的版本,但最好保持版本一致。 【参考方案1】:

正如@JamesR.Perkins 所建议的,这是由于使用了旧版本的验证提供程序resteasy-validator-providerresteasy-vertx 相比。此外,我使用的是旧的工件 ID。

为了让这个工作我从我的build.gradle 中删除了org.jboss.resteasy:resteasy-validator-provider-11:3.0.11.Final 并添加了org.jboss.resteasy:resteasy-validator-provider:4.5.3.Final。请注意,工件 ID 已从 resteasy-validator-provider-11 更新为 resteasy-validator-provider,我为验证器选择了版本 4.5.3.Final,因为它与我使用的 resteasy-vertx 版本匹配。

为了清楚起见,我的项目现在直接依赖于以下内容(列在build.gradle 中):

org.jboss.resteasy:resteasy-validator-provider:4.5.3.Final
| org.hibernate:hibernate-validation:6.2.0.Final // Pulled in via the above

并且依赖于以下传递(通过依赖的依赖):

org.jboss.resteasy:resteasy-vertx:4.5.3.Final
| org.jboss.resteasy:resteasy-client:4.5.3.Final // Pulled in as a dependency of the above transient depdency

注意:| 表示子依赖(依赖的依赖或传递依赖的依赖)。

【讨论】:

以上是关于如何使用 REST Easy 和 Vertx 启用 @Valid 注释的主要内容,如果未能解决你的问题,请参考以下文章

REST easy with kbmMW #15 – Handling HTTP POST

从 vertx 中的客户端证书中提取用户主体

REST easy with kbmMW #4 – Access management

如何使用 vertx 拆分和合并文件 [关闭]

如何在 REST API 上直接启用托管元数据字段的过滤器?

Rest easy 3 + Jackson + Tomcat + XML 响应