在Jersey网站上的入门指南之后:
我执行了以下构建命令:
- $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
然后我按照教程进行操作
https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783
- @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";
- }
我尝试使用命名绑定和动态绑定注册此过滤器,没有任何作用.
为了便于重现,我还尝试了官方资源的一个例子:
https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping
同样的问题:自定义过滤器不会被执行.
这是一个灰熊问题吗?
解决方法
事实证明,您必须手动注册自定义类 – 如:
- rc.register(com.dummy.mypackage.CORSResponseFilter.class);
完整示例:
- /**
- * 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 Jackson JSON
- rc.packages("org.glassfish.jersey.examples.jackson").register(JacksonFeature.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);
- }
- ...
- }