java – jersey 2.2:ContainerResponseFilter和ContainerRequestFilter永远不会被执行

前端之家收集整理的这篇文章主要介绍了java – jersey 2.2:ContainerResponseFilter和ContainerRequestFilter永远不会被执行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Jersey网站上的入门指南之后:

我执行了以下构建命令:

  1. $mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
  2. -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
  3. -DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \
  4. -DarchetypeVersion=2.2

然后我按照教程进行操作

https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783

添加自定义ContainerResponseFilter:

  1. @NameBinding
  2. @Retention(RetentionPolicy.RUNTIME)
  3. static @interface CORSBinding {}
  4.  
  5. @Provider
  6. @Priority(Priorities.HEADER_DECORATOR)
  7. @CORSBinding
  8. static class CrossDomainFilter implements ContainerResponseFilter {
  9. @Override
  10. public void filter(ContainerRequestContext creq,ContainerResponseContext cres) {
  11. Logger.getLogger("com.example").log( Level.INFO,"before: {0}",cres.getHeaders());
  12. cres.getHeaders().add("Access-Control-Allow-Origin","*");
  13. cres.getHeaders().add("Access-Control-Allow-Headers","origin,content-type,accept,authorization");
  14. cres.getHeaders().add("Access-Control-Allow-Credentials","true");
  15. cres.getHeaders().add("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS,HEAD");
  16. cres.getHeaders().add("Access-Control-Max-Age","1209600");
  17. Logger.getLogger("com.example").log( Level.INFO,"after: {0}",cres.getHeaders());
  18. }
  19. }
  20.  
  21. @Provider
  22. static class MyResponseFilter implements ContainerResponseFilter {
  23.  
  24. @Override
  25. public void filter(ContainerRequestContext requestContext,ContainerResponseContext responseContext) throws IOException {
  26. System.out.println("MyResponseFilter.postFilter() enter");
  27. responseContext.setEntity(
  28. responseContext.getEntity() + ":" + getClass().getSimpleName(),null,MediaType.TEXT_PLAIN_TYPE);
  29. System.out.println("MyResponseFilter.postFilter() exit");
  30. }
  31. }
  32.  
  33. ...
  34. @GET
  35. @Produces(MediaType.TEXT_PLAIN)
  36. @CORSBinding
  37. public String helloWorld() {
  38. return "hello world";
  39. }

我尝试使用命名绑定和动态绑定注册此过滤器,没有任何作用.

为了便于重现,我还尝试了官方资源的一个例子:

https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping

同样的问题:自定义过滤器不会被执行.

这是一个灰熊问题吗?

解决方法

事实证明,您必须手动注册自定义类 – 如:
  1. rc.register(com.dummy.mypackage.CORSResponseFilter.class);

完整示例:

  1. /**
  2. * Main class.
  3. *
  4. */
  5. public class Main {
  6. // Base URI the Grizzly HTTP server will listen on
  7. public static final String BASE_URI = "http://192.168.1.34:8080/myapp/";
  8.  
  9. /**
  10. * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
  11. * @return Grizzly HTTP server.
  12. */
  13. public static HttpServer startServer() {
  14. // create a resource config that scans for JAX-RS resources and in com.example package
  15. final ResourceConfig rc = new ResourceConfig().packages("com.dummy.mypackage");
  16.  
  17. //NEW: register custom ResponseFilter
  18. rc.register(com.dummy.mypackage.CORSResponseFilter.class);
  19.  
  20. // Register Jackson JSON
  21. rc.packages("org.glassfish.jersey.examples.jackson").register(JacksonFeature.class);
  22.  
  23. // create and start a new instance of grizzly http server
  24. // exposing the Jersey application at BASE_URI
  25. return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI),rc);
  26. }
  27. ...
  28. }

猜你在找的Java相关文章