【问题标题】:Match Filter with specific Method through NameBinding on RESTeasy通过 RESTeasy 上的 NameBinding 将过滤器与特定方法匹配
【发布时间】:2013-02-13 16:28:04
【问题描述】:

我正在尝试按照RESTeasy documentation 的建议指定一个仅与我的某些 API 调用相关联的预匹配过滤器。这是我的代码的样子:

名称绑定:

@NameBinding
public @interface ValidateFoo {}

资源:

@Path("/foo/bar")
@Produces(MediaType.APPLICATION_JSON)
public class FooBar {
    @GET
    @ValidateFoo
    public Object doStuff() {
        //do stuff
    }

    @POST
    public Object doAnotherStuff() {
        //do another stuff
    }
}

过滤器:

@ValidateFoo
@Provider
@PreMatching
public class FooValidation implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext reqContext) throws IOException {
        //validate stuff
    }
}

问题是:FooValidation 过滤器在 每个 方法调用之前运行(例如:在 GET 和 POST 到 /foo/bar 之前),而不仅仅是那些用 @ValidateFoo 注释的过滤器(对我来说似乎是一个错误)。如果我从过滤器中删除 @Provider 注释,它将不会在任何调用之前运行(如预期的那样)。

我一直看到这种行为,无论是使用 WebLogic 还是使用 Tomcat。我的依赖管理是通过Maven完成的,RESTeasy版本是3.0-beta-3。

任何人都经历过/经历过相同的行为?我在JBoss forums 上看到另一位用户遇到类似问题,但目前没有运气。

更新: RESTeasy 3.0.1-Final 仍然遇到同样的问题。

【问题讨论】:

    标签: java rest tomcat jax-rs resteasy


    【解决方案1】:

    我有类似的问题。对我来说,解决方案是添加以下注释配置(到@ValidateFoo):

    @Target({ ElementType.TYPE, ElementType.METHOD })
    @Retention(value = RetentionPolicy.RUNTIME)
    @NameBinding
    

    【讨论】:

    • 感谢您的建议。我试过了,但即使在更改之后,过滤器仍然会在每次调用我的应用程序之前被调用,而不仅仅是那些用 @ValidateFoo 注释的。
    • 好的,现在我们可以让它工作了。看起来 RESTeasy 不喜欢 @PreMatching 注释。通过遵循您的建议并删除 @PreMatching 注释,一切都按预期工作。谢谢!
    • 有点意思,因为@PreMatching 表示在将请求映射到 RESTEasy 资源之前,所以此时 RESTEasy 不知道是否有任何名称绑定。
    • "在使用 @PreMatching 注释注释的组件上,任何 @NameBinding 命名的绑定注释都将被忽略。" -- javax.ws.rs.container.PreMatching
    • 只是为了强调。保留的默认值为 CLASS 而不是运行时。因此你需要它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2018-08-12
    • 2022-12-22
    • 1970-01-01
    相关资源
    最近更新 更多