如何使用 REST Easy 和 Vertx 启用 @Valid 注解
How to enable @Valid annotation with REST Easy and Vertx
我正在尝试让 @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 调用 someController
时(即 someField
是 ""
),错误是返回并且不执行 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
,因为我认为这不是必需的)。任何帮助将不胜感激!
正如@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
注意:|
表示子依赖(依赖的依赖或者传递依赖的依赖)
我正在尝试让 @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 调用 someController
时(即 someField
是 ""
),错误是返回并且不执行 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
,因为我认为这不是必需的)。任何帮助将不胜感激!
正如@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
注意:|
表示子依赖(依赖的依赖或者传递依赖的依赖)