泽西岛 ContainerResponseFilter 不工作
Jersey ContainerResponseFilter not working
我正在使用 Jersey 并且我实现了一个 ContainerRequestFilter。
现在我还想添加一个 ContainerResponseFilter 来为每个请求添加一个 header 但是当访问 web 服务时没有任何反应。
过滤器是这样的:
public class ResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Cache-Control", "whatever");
}
}
我的球衣相关性:
compile 'org.glassfish.jersey.core:jersey-client:2.18'
compile 'org.glassfish.jersey.containers:jersey-container-servlet-core:2.18'
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.18'
我像这样在 xml 中注册提供商:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>controller.webservice</param-value>
</init-param>
//This is the request filter, which is working fine
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>model.filter.AuthenticationFilter</param-value>
</init-param>
//Response filter, does not work
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>model.filter.ResponseFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
这没有用,所以我尝试使用注解 @Provider 注册提供者,并在网络服务中像这样:
register(TokenModifier.class);
但是其中 none 有效。我阅读了其他几篇文章,但找不到答案。有人对此有想法吗?
这个初始化参数
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>controller.webservice</param-value>
</init-param>
被 Jersey 用于扫描为 @Path
和 @Provider
注释的 类 列出的包,并注册它们。列出的包将被递归扫描。因此,例如,使用您当前的配置,将扫描以下所有包
controller.webservice
controller.webservice.x
controller.webservice.x.y
controller.webservice.x.y.z
param的值也可以是多个值,用逗号或分号隔开。因此,如果您的过滤器位于不同的包库中,您可以将该包添加到要扫描的包列表中
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>controller.webservice, com.my.filters</param-value>
</init-param>
但就我个人而言,如果我使用 web.xml,我将只使用一个基本包,并让所有其他包从该包扩展。像
com.company.app
com.company.app.domain
com.company.app.filters
com.company.app.resources
然后你可以把com.company.app
作为初始参数值,所有其他子包也会被扫描。
我正在使用 Jersey 并且我实现了一个 ContainerRequestFilter。 现在我还想添加一个 ContainerResponseFilter 来为每个请求添加一个 header 但是当访问 web 服务时没有任何反应。
过滤器是这样的:
public class ResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Cache-Control", "whatever");
}
}
我的球衣相关性:
compile 'org.glassfish.jersey.core:jersey-client:2.18'
compile 'org.glassfish.jersey.containers:jersey-container-servlet-core:2.18'
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.18'
我像这样在 xml 中注册提供商:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>controller.webservice</param-value>
</init-param>
//This is the request filter, which is working fine
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>model.filter.AuthenticationFilter</param-value>
</init-param>
//Response filter, does not work
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>model.filter.ResponseFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
这没有用,所以我尝试使用注解 @Provider 注册提供者,并在网络服务中像这样:
register(TokenModifier.class);
但是其中 none 有效。我阅读了其他几篇文章,但找不到答案。有人对此有想法吗?
这个初始化参数
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>controller.webservice</param-value>
</init-param>
被 Jersey 用于扫描为 @Path
和 @Provider
注释的 类 列出的包,并注册它们。列出的包将被递归扫描。因此,例如,使用您当前的配置,将扫描以下所有包
controller.webservice
controller.webservice.x
controller.webservice.x.y
controller.webservice.x.y.z
param的值也可以是多个值,用逗号或分号隔开。因此,如果您的过滤器位于不同的包库中,您可以将该包添加到要扫描的包列表中
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>controller.webservice, com.my.filters</param-value>
</init-param>
但就我个人而言,如果我使用 web.xml,我将只使用一个基本包,并让所有其他包从该包扩展。像
com.company.app
com.company.app.domain
com.company.app.filters
com.company.app.resources
然后你可以把com.company.app
作为初始参数值,所有其他子包也会被扫描。