通过RESTeasy上的NameBinding将筛选器与特定方法匹配

Vic*_*ari 10 java rest tomcat jax-rs resteasy

我试图通过遵循RESTeasy文档建议的内容,指定仅与我的一些API调用相关联的预匹配过滤器.这是我的代码的样子:

名称绑定:

@NameBinding
public @interface ValidateFoo {}
Run Code Online (Sandbox Code Playgroud)

资源:

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

    @POST
    public Object doAnotherStuff() {
        //do another stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

过滤:

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

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

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

任何体验/经历过同样行为的人?我见过另一个在JBoss论坛上遇到类似问题的用户,到目前为止没有运气.

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

小智 8

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

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(value = RetentionPolicy.RUNTIME)
@NameBinding
Run Code Online (Sandbox Code Playgroud)

  • 好的,现在我们能够让它发挥作用.看起来RESTeasy不喜欢`@ PreMatching`注释.通过遵循你的建议并删除`@ PreMatching`注释,一切都按预期工作.谢谢! (4认同)
  • 这有点意义,因为`@ PreMatching`意味着在将请求映射到RESTEasy资源之前,所以此时RESTEasy不知道是否有任何名称绑定. (3认同)