使用Tapestry Resteasy的拦截器

时间:2014-05-09 10:38:18

标签: jboss resteasy tapestry tynamo

我有一个资源类,我希望能够在调用资源方法之前检查身份验证令牌,从而避免将令牌直接传递给Resource方法。

我已将以下内容添加到web.xml中:

<context-param>
        <param-name>resteasy.providers</param-name>
       <param-value>com.michael.services.interceptors.AuthorisationInterceptorImpl</param-value>
</context-param>

我的拦截器实现如下:

@Provider
public class AuthorisationInterceptorImpl implements javax.ws.rs.container.ContainerRequestFilter {

    @Inject
    private ApiAuthenticationService apiAuthenticationService

    @Override
    public void filter(ContainerRequestContext requestContext) {

       //Code to verify token   

    }

}

在我的资源类中的方法之前调用filter方法;但是,当我尝试调用它的方法时,apiAuthenticationService没有被注入并且为null 我正在使用Tapestry 5.3.7,Tapestry-Resteasy 0.3.2和Resteasy 2.3.4.Final。 可以这样做吗?

2 个答案:

答案 0 :(得分:1)

我认为这不会起作用,基于对挂毯重新编码的快速浏览。

@Inject注释是tapestry-ioc的一部分;如果一个类没有被Tapestry实例化,则@Inject注释不受尊重。

web.xml中定义的过滤器由servlet容器(Jetty,Tomcat等)实例化,这些容器没有Tapestry和Tapestry注释的任何特殊知识。

我认为你最好在Tapestry的HttpServletRequestHandler或RequestHandler管道中提供一个过滤器(参见他们的JavaDoc)。但是,我不确定如何获得对ContainerRequestContext的访问权。

答案 1 :(得分:1)

使用tapestry-resteasy,您无需在web.xml文件中定义提供程序。

如果您想使用Tapestry的autobuild机制,只需将您的提供商与您的资源一起移至 .rest 包。

如果不想使用自动发现/ autobuild,只需将其贡献给javax.ws.rs.core.Application

@Contribute(javax.ws.rs.core.Application.class)
    public static void configureRestProviders(Configuration<Object> singletons, AuthorisationInterceptor authorisationInterceptor)
    {
        singletons.add(authorisationInterceptor);
    }

即使您可以使用其他提供程序来获取安全性,也可以采用Howard的建议并在挂毯管道中实现自己的过滤器。

顺便说一下,你也可以尝试tapestry-security:)