假设我用传递给 REST 调用的参数定义了一个 POJO
class MyVO {
@NotNull
@PathParam("name")
private String name;
@NotNull
@PathParam("age")
private Integer age;
// getters and setters
}
public class RESTclass {
public postData( @Form MyVO vo ) {
}
}
它会自动绑定(bind) MyVO 中的对象。但是我从哪里得到验证错误呢? 它会在绑定(bind)期间触发验证吗?如果没有,如何触发验证?
Spring 可以很好地完成所有这些工作。它具有您可以注入(inject)的 BindingResult 参数。 这里的等价物是什么?
有什么想法吗?
最佳答案
3.0.1.Final 之前的 RestEasy 版本
对于 bean validation 1.0,Resteasy 有一个自定义验证提供程序,它在后台使用 hibernate 的 bean validator 实现。
为了在 Resteasy 中启动并运行验证,您需要执行以下操作:
添加
resteasy-hibernatevalidator-provider
对你的项目的依赖。如果您使用的是 maven,这里是 maven pom 条目:<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-hibernatevalidator-provider</artifactId> <version>${resteasy.version}</version> </dependency>
使用
@ValidateRequest
在您希望进行验证的位置注释您的资源类注释。@Named @Path("/users") @ValidateRequest public class UserResource extends BaseResource { @POST @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) public Response createUser(@Valid User user) { //Do Something Here } }
Resteasy 会自动检测
HibernateValidatorAdapter
在类路径上并开始调用 bean 验证。创建
ExceptionMapper<MethodConstraintViolationException>
实现来处理验证错误。与在 Spring 中您必须检查 BindingResult 不同,当在 Resteasy 中遇到验证错误时,hibernate validator 将抛出
MethodConstraintViolationException
。 .MethodConstraintViolationException
将包含其中的所有验证错误。@Provider public class MethodConstraintViolationExceptionMapper extends MyBaseExceptionMapper implements ExceptionMapper<MethodConstraintViolationException> { @Override public Response toResponse(MethodConstraintViolationException exception) { //Do Something with the errors here and create a response. } }
RestEasy 版本 3.0.1.Final
Resteasy 的最新版本现在支持 bean 验证规范 1.1,并且更改了 api 和抛出的异常。
而不是
resteasy-hibernatevalidator-provider
你要去 需要resteasy-validator-provider-11
依赖。您不需要添加
@ValidateRequest
到你的资源类 因为默认情况下验证测试是打开的resteasy-validator-provider-11
.而不是抛出
MethodConstraintViolationException
什么时候 检测到违规,RESTEasyViolationException
的一个实例 将被抛出。
关于java - RestEasy - 参数绑定(bind) - 验证和错误 - EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17435544/