Java – Jersey 2.2: containerresponsefilter and containerrequestfilter will never be executed
•
Java
After the getting started guide on the Jersey website:
I executed the following build commands:
$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
Then I follow the tutorial
https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783
To add a custom 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 dynamic binding, and it didn't work
To facilitate reproduction, I also tried an example of official resources:
https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping
The same problem: custom filters will not be executed
Is this a grizzly bear problem?
Solution
It turns out that you have to register custom classes manually – for example:
rc.register(com.dummy.mypackage.CORSResponseFilter.class);
Complete 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 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);
}
...
}
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
