RESTeasy ContainerRequestFilter 永远不会被调用
RESTeasy ContainerRequestFilter is never being called
我正在尝试在 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
在 AuthFilter
的 @Provider
正上方,在 printMessage
的 @GET
上方。那也不行。
我已经尝试在 web.xml
中明确列出过滤器
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.myPackage.mvc.servlet.API.AuthFilter</param-value>
</context-param>
为什么我的过滤器从未被调用?我还有另外两个 类 标记为 @Provider
并且它们被系统识别,我可以在其中放置断点并且它们按预期工作。
将 @PreMatching
或 @PostMatching
添加到您的 ContainerRequestFilter
我改用 Jersey 而不是 RESTeasy,一切正常。
在您的 META-INF/services
下添加一个 Provider 文件,例如:/META-INF/services/javax.ws.rs.ext.Providers
。
javax.ws.rs.ext.Providers
是一个文件,内容就是你的filter路径如:
com.hujiang.foe.instalment.liquidation.biz.impl.account.filter.ContextCleanFilter
我正在尝试在 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
在 AuthFilter
的 @Provider
正上方,在 printMessage
的 @GET
上方。那也不行。
我已经尝试在 web.xml
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.myPackage.mvc.servlet.API.AuthFilter</param-value>
</context-param>
为什么我的过滤器从未被调用?我还有另外两个 类 标记为 @Provider
并且它们被系统识别,我可以在其中放置断点并且它们按预期工作。
将 @PreMatching
或 @PostMatching
添加到您的 ContainerRequestFilter
我改用 Jersey 而不是 RESTeasy,一切正常。
在您的 META-INF/services
下添加一个 Provider 文件,例如:/META-INF/services/javax.ws.rs.ext.Providers
。
javax.ws.rs.ext.Providers
是一个文件,内容就是你的filter路径如:
com.hujiang.foe.instalment.liquidation.biz.impl.account.filter.ContextCleanFilter