首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JAX-RS自定义路径参数验证器

JAX-RS自定义路径参数验证器
EN

Stack Overflow用户
提问于 2012-06-13 18:19:42
回答 2查看 4.7K关注 0票数 3

我目前正在试验一些RESTful JAX,我想验证一个自定义输入。通常正则表达式就可以了,但我需要做更广泛的检查(大约10种不同的正则表达式模式)。在搜索jaxrs验证时,我发现了this page。我注意到上面写着“草稿”,但我想我应该试一试。

我把我的参数注释写成这样:

代码语言:javascript
复制
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FooBarValidator.class)
public @interface FooBarParam
{
}

验证器如下所示:

代码语言:javascript
复制
@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服务如下所示:

代码语言:javascript
复制
@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服务就会被调用,并且会出现"tested with: 11”。web服务运行良好,只是验证器不会被调用。

我尝试过在验证器类和注释接口中设置断点,但都没有成功。

我有一种隐约的怀疑,我正在做一些不可能的事情,因为参考文档中的"Draft“头。因此,如果我做错了什么,或者如果有其他选择,我很高兴听到这些。

EN

Stack Overflow用户

回答已采纳

发布于 2012-06-16 05:27:42

多亏了@PiotrKochań给我的提示,我已经成功地实现了,这正是我想要的。最大的问题是我一定要使用Glassfish。默认情况下,Glassfish使用Jersey来处理JAX内容。

我花了10多个小时才完成这篇文章,所以让这篇文章为那些偶然发现这篇文章的人节省时间吧。

首先,使用Maven,这会让你的工作变得更轻松。

第二步,将JBoss存储库添加到您的pom.xml

代码语言:javascript
复制
<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添加依赖项

代码语言:javascript
复制
<!-- 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中,我发现了这个:

应用程序接口实现和RESTEasy之间的集成是通过resteasy-hibernatevalidator-provider组件完成的。为了集成,我们需要将resteasy-hibernatevalidator-provider和hibernate-validator添加到类路径中。对于maven,这只是一个包含以下依赖的问题:

代码语言:javascript
复制
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-hibernatevalidator-provider</artifactId>
    <version>2.3-RC1</version>
</dependency>

第四步是将此代码添加到web.xml

代码语言:javascript
复制
<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服务类:

代码语言:javascript
复制
@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修改为:

代码语言:javascript
复制
@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,我想我可以分享一下,因为它解释了很多有趣的东西。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11012821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档