Java jersey 2.2:ContainerResponseFilter 和 ContainerRequestFilter 永远不会被执行
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18842390/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
jersey 2.2: ContainerResponseFilter and ContainerRequestFilter never get executed
提问by bey
Following the getting started guide on the Jersey website:
按照 Jersey 网站上的入门指南:
I executed the following build command:
我执行了以下构建命令:
$ mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \
-DarchetypeVersion=2.2
I then followed the tutorial on
然后我按照教程
https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783
https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783
to add a custom ContainerResponseFilter:
添加自定义 ContainerResponseFilter:
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
static @interface CORSBinding {}
@Provider
@Priority(Priorities.HEADER_DECORATOR)
@CORSBinding
static class CrossDomainFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext creq, ContainerResponseContext cres) {
Logger.getLogger("com.example").log( Level.INFO, "before: {0}", cres.getHeaders());
cres.getHeaders().add("Access-Control-Allow-Origin", "*");
cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
cres.getHeaders().add("Access-Control-Max-Age", "1209600");
Logger.getLogger("com.example").log( Level.INFO, "after: {0}", cres.getHeaders());
}
}
@Provider
static class MyResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
System.out.println("MyResponseFilter.postFilter() enter");
responseContext.setEntity(
responseContext.getEntity() + ":" + getClass().getSimpleName(), null, MediaType.TEXT_PLAIN_TYPE);
System.out.println("MyResponseFilter.postFilter() exit");
}
}
...
@GET
@Produces(MediaType.TEXT_PLAIN)
@CORSBinding
public String helloWorld() {
return "hello world";
}
I tried to register this filter with Named Binding and with Dynamic Binding, nothing works.
我尝试使用命名绑定和动态绑定注册此过滤器,但没有任何效果。
To easily reproduce, I also tried an example from the official resources:
为了方便复现,我还尝试了一个来自官方资源的例子:
https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping
https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping
The same problem: the custom filters do not get executed.
同样的问题:自定义过滤器不会被执行。
Is this a Grizzly problem?
这是灰熊的问题吗?
采纳答案by bey
As it turns out you have to manually register the custom classes - as in:
事实证明,您必须手动注册自定义类 - 如:
rc.register(com.dummy.mypackage.CORSResponseFilter.class);
Full example:
完整示例:
/**
* Main class.
*
*/
public class Main {
// Base URI the Grizzly HTTP server will listen on
public static final String BASE_URI = "http://192.168.1.34:8080/myapp/";
/**
* Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
* @return Grizzly HTTP server.
*/
public static HttpServer startServer() {
// create a resource config that scans for JAX-RS resources and in com.example package
final ResourceConfig rc = new ResourceConfig().packages("com.dummy.mypackage");
//NEW: register custom ResponseFilter
rc.register(com.dummy.mypackage.CORSResponseFilter.class);
// Register Hymanson JSON
rc.packages("org.glassfish.jersey.examples.Hymanson").register(HymansonFeature.class);
// create and start a new instance of grizzly http server
// exposing the Jersey application at BASE_URI
return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
}
...
}
回答by 4Kan
Adding the following code in web.xmlusing Tomcat container is what worked for me:
使用 Tomcat 容器在web.xml 中添加以下代码对我有用:
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>my.package.SecurityRequestFilter;org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>`
My thanks goes to:
我要感谢:
http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/
http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/