Jersey 未触发任何ContainerRequestFilter
我正在尝试使用Jersey 未触发任何ContainerRequestFilter,jersey,jersey-2.0,Jersey,Jersey 2.0,我正在尝试使用ContainerRequestFilter在基于Tomcat的应用程序上实施一些身份验证。我跟着。 问题:过滤器从未触发 过滤器类: @Provider public class AuthFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException
ContainerRequestFilter
在基于Tomcat的应用程序上实施一些身份验证。我跟着。
问题:过滤器从未触发
过滤器类:
@Provider
public class AuthFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {
// MY AUTHENTICATION CODE GOES HERE
}
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="debate-rest"
version="3.0">
<display-name>rest</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.hck.debate.rest.security.AuthFilter</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.hck.debate.rest.controller</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
休息
泽西岛休息服务
org.glassfish.jersey.servlet.ServletContainer
com.sun.jersey.spi.container.ContainerRequestFilters
com.hck.discussion.rest.security.AuthFilter
jersey.config.server.provider.packages
com.hck.discussion.rest.controller
com.sun.jersey.api.json.POJOMappingFeature
真的
1.
泽西岛休息服务
/*
好的,我不知道jersey.config.server.provider.packages
init参数不仅需要引用服务类(API端点),还需要引用包括过滤器在内的所有类
现在它可以工作了:
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.hck.debate.rest.controller;com.hck.debate.rest.security</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.hck.debate.rest.security.AuthFilter</param-value>
</init-param>
jersey.config.server.provider.packages
com.hck.discussion.rest.controller;com.hck.discussion.rest.security
com.sun.jersey.spi.container.ContainerRequestFilters
com.hck.discussion.rest.security.AuthFilter
我还必须将@ProviderJAX-RS注释添加到我的过滤器中。这使得过滤器在JAX-RS扫描阶段可以被发现
@Provider
public class MyAppFilter implements ContainerRequestFilter {
// filter logic
}
与球衣一起使用过滤器的最低要求:
- 将@Provider注释添加到筛选器类
- 筛选器类的命名空间必须包含在'jersey.config.server.provider.packages'init param中
不需要任何其他设置(例如“com.sun.jersey.spi.container.ContainerRequestFilters”init param或ResourceConfig)对于JAX-RS 2,jersey和下面的注释,我也遇到了同样的问题
@PreMatching
一些提示:
import javax.ws.rs.container.ContainerRequestContext代码>
导入javax.ws.rs.container.ContainerRequestFilter代码>
@Provider
注释您可以使用
JerseyServletFactory
手动注册ContainerRequestFilter
,而不是使用@Provider
注释(在我的情况下,该注释不起作用):
JerseyServletFactory jerseyServletFactory = new JerseyServletFactory(config);
HttpServlet myServiceServlet = jerseyServletFactory.create(myResource);
// Register your ContainerRequestFilter like this
jerseyServletFactory.addRequestFilter(new MyFilter());
httpServer.register(myServiceServlet, "/api");
httpServer.start();
我没有使用javax.ws.rs,而是使用com.sun.jersey
import com.sun.jersey.spi.container.ContainerRequestFilter
导入com.sun.jersey.spi.container.ContainerRequest
Dropwizard用户需要这样做
environment.jersey().getResourceConfig()
.getContainerRequestFilters()
.add(filter);
如果您像我一样陷入困境,请注意,TomEE 1.7.X使用JAX-RS 1.1,其中不包括ContainerRequestFilter。适用于MULE ESB中存在此问题的任何人。 请记住将路径注册到:
<jersey:resources doc:name="REST">
<component doc:name="rest component">
<spring-object bean="endpoit"/>
</component>
<jersey:package packageName="path @Provider-s"/>
</jersey:resources >
我们在ResourceConfig实现类中缺少以下调用:
register(CorrelationIdFilter.class);
您上面的代码与TomCat一样工作,可能与Glas FISH不同默认行为是递归扫描,因此,您也可以只使用单基包
com.hck.discome.rest
还要注意com.sun.jersey.spi.container.ContainerRequestFilters
和com.sun.jersey.api.json.POJOMappingFeature
是无用的。这些是Jersey 1.x属性。它们对Jersey 2.xAlso没有影响。请注意,默认情况下,包扫描是递归的。因此,与其列出多个包,不如声明一个基本包,如com.hck.discome.rest
,它将递归地扫描所有子包。仅供参考,扫描的目的是提取带有@Provider
和@Path
注释的类,因此,您需要确保也有@Provider
注释。这里没有注释也没有发生任何事情“@Provider”真的有必要吗?是的,我只需要添加@Provider注释。包扫描已经正确设置,这段代码应该放在哪里?@jon在初始化过程中。我将代码放在JettyHttpServer
的创建和启动之间,其他需要在启动时初始化的东西(数据源、资源、DAO等)我也这样做了,现在我想调用servlet的destroy(对于一些自定义清理任务)。我无法获取此筛选器的引用以在关机事件中调用destroy。是否确实需要“@Provider”?是的,它将组件注释为某个提供程序。它用于扩展基本JAX-RS功能。它真的需要“@Provider”吗?是的。Jersey将仅从指定的名称空间加载标记的类,但这会更改语义!添加此方法仅影响调用筛选器的时间。我严重怀疑这会改变任何东西的配置!谢谢,这正是我所需要的。从而创建了依赖于您不应该依赖的包的代码。