我正在尝试一些RESTful JAX,我想验证自定义输入。通常正则表达式会很好,但我需要做更广泛的检查(~10种不同的正则表达式模式)。我在搜索jaxrs验证时找到了this page。我注意到它说“草稿”,但我想我会尝试一下。
我写了这样的参数注释:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FooBarValidator.class)
public @interface FooBarParam
{
}
验证器如下所示:
@Provider
public class FooBarValidator
implements ConstraintValidator<FooBar, Long>
{
@Override
public void initialize(FooBar constraintAnnotation)
{
}
@Override
public boolean isValid(Long value, ConstraintValidatorContext context)
{
// validation goes here, this is a test validation
return (value > 50);
}
}
Web服务如下所示:
@javax.ejb.Stateless
@Path("test")
public class testRS
{
@GET
@Path("foobar/{fooBar: [0-9]+}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.TEXT_PLAIN)
public String testService(@FooBar @PathParam("fooBar") Long fooBar)
{
return "tested with: " + fooBar;
}
}
但是如果我用我的浏览器使用“http:// localhost:8080 / jaxtest / rest / test / foobar / 11”来调用我的Web服务,那么Web服务就会被调用,我会看到“测试时:11” 。 Web服务工作正常,但验证器不会被调用。
我已经尝试在验证器类和注释界面中设置断点但没有命中。
我有一种潜在的怀疑,因为引用文档中的“草稿”标题,我正在做一些不可能的事情。所以,如果我做错了或者有其他选择,我很高兴听到它。
答案 0 :(得分:2)
感谢@PiotrKochański给我的提示我已成功实施了完全我想要的东西。最大的问题是我一定会使用Glassfish。默认情况下,Glassfish使用Jersey来处理JAX内容。
我花了10多个小时努力完成这项任务,所以让这对于任何偶然发现此事的人来说都是一个节省时间。
首先,使用Maven ,这会让您的生活变得更加轻松。
第二步,将JBoss repo添加到你的pom.xml
<repositories>
<repository>
<id>jboss-public-repository-group</id>
<name>JBoss Public Maven Repository Group</name>
<url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
</repositories>
第三步,将依赖项添加到pom.xml
<!-- Needed for validator interceptors -->
<dependency>
<groupId>org.jboss.seam.rest</groupId>
<artifactId>seam-rest</artifactId>
<version>3.1.0.Final</version>
</dependency>
<!-- JBoss' RS implementation -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>2.3.4.Final</version>
</dependency>
<!-- Because I use JSON I need RESTeasy be able to handle this -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jettison-provider</artifactId>
<version>2.3.4.Final</version>
</dependency>
<!-- This is THE part that integrates validation in RESTeasy -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-hibernatevalidator-provider</artifactId>
<version>2.3.4.Final</version>
</dependency>
最后的依赖花了我很长一段时间。 The docs @PiotrKochański pointed to没有提到这一点。但是在another version of the docs我发现了这个:
API实现和RESTEasy之间的集成是通过resteasy-hibernatevalidator-provider组件完成的。为了集成,我们需要在类路径中添加resteasy-hibernatevalidator-provider和hibernate-validator。使用maven,只需要包含以下依赖项:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-hibernatevalidator-provider</artifactId>
<version>2.3-RC1</version>
</dependency>
第四步是将其添加到web.xml
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>REST Service</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
第五步是修改Web服务类,如下所示:
@javax.ejb.Stateless
@Path("test")
public class testRS
{
@GET
@Path("foobar/{fooBar}")
@Produces(MediaType.APPLICATION_JSON)
@org.jboss.resteasy.spi.validation.ValidateRequest
public String testService(@FooBar @PathParam("fooBar") Long fooBar)
{
return "tested with: " + fooBar;
}
}
第六步是将@interface
修改为:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FooBarValidator.class)
public @interface FooBarParam
{
String message() default "{constraint.FooBar}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
也作为奖励;我遇到a presentation about Bean Validation by Emmanuel Bernard我想我可能会分享,因为这解释了许多有趣的东西。
答案 1 :(得分:0)
您找到的页面是关于应该进入JAX-RS 2.0的建议之一(这不是最终的,也没有实现)。计划是让JAX-RS 2.0与Bean验证集成 - 但正如我所说,这还没有实现。
目前,如果要验证输入,可以将参数声明为String(而不是Long),并将验证作为资源方法的一部分进行。如果验证通过,则转换为Long。