永远不会调用RESTeasy ContainerRequestFilter

时间:2016-05-26 08:37:43

标签: java rest tomcat jboss resteasy

我正在尝试在Tomcat 8中使用RESTeasy 3.0.17FINAL实现身份验证过滤器。这里我有web.xml个条目。

<!-- RESTEasy Config -->
<listener>
    <listener-class>
        org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
    </listener-class>
</listener>
<servlet>
    <servlet-name>RESTEasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>RESTEasy</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.providers</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>

这里我有我的测试API

@Path("/test")
public class TestAPI extends APIServlet {

    @GET
    @Path("/{id}")
    @AllowUsers
    @Produces(MediaType.APPLICATION_JSON)
    public Response printMessage(@PathParam("id") int id) {
        JsonObject json = new JsonObject();
        json.addProperty("status", "awesome");
        json.addProperty("yeah", "It worked");
        return Response.ok(json).build();
    }
}

这是我的临时过滤器:

@Provider
public class AuthFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {
        if(Math.random() < 0.5) {
            containerRequestContext.abortWith(Response.status(403).build());
        }
        System.out.println("Filtered");
    }
}

永远不会调用我的过滤器。从未到达println,我无法在过滤器中成功放置断点。 cataline或localhost日志中没有错误消息。我尝试过使用名称绑定注释:

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

@Secured位于@ProviderAuthFilter正上方@GET上方printMessage上方web.xml这也不起作用。

我已尝试在<context-param> <param-name>resteasy.providers</param-name> <param-value>com.myPackage.mvc.servlet.API.AuthFilter</param-value> </context-param>

中明确列出过滤器
@Provider

为什么我的过滤器永远不会被调用?我还有另外两个标记为click的类,它们被系统识别,我可以在其中放置断点,并且它们按预期工作。

3 个答案:

答案 0 :(得分:1)

META-INF/services下添加提供商文件,例如:/META-INF/services/javax.ws.rs.ext.Providers

javax.ws.rs.ext.Providers是一个文件,内容是您的过滤路径,如:

com.hujiang.foe.instalment.liquidation.biz.impl.account.filter.ContextCleanFilter

答案 1 :(得分:0)

public IEnumerable<T> GetRecordList(DateTime date) { var parameterExpression = Expression.Parameter(typeof(T), "object"); var propertyOrFieldExpression = Expression.PropertyOrField(parameterExpression, "Date"); var equalityExpression = Expression.Equal(propertyOrFieldExpression, Expression.Constant(date, typeof(DateTime))); var lambdaExpression = Expression.Lambda<Func<T, bool>>(equalityExpression, parameterExpression); var query = _genericRepository.FindBy(lambdaExpression); return query; } @PreMatching添加到您的@PostMatching

答案 2 :(得分:0)

我换了泽西而不是RESTeasy,一切正常。