如何使用 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-provider
与resteasy-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
REST easy with kbmMW #4 – Access management