问题
I have this server initialization class:
package magic.app.main;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import java.io.IOException;
import java.net.URI;
public class Main {
public static final String BASE_URI = "http://localhost:4747/";
public static void main(String[] args) throws IOException {
/* SOME NON-RELEVANT CODE UP HERE */
final ResourceConfig rc = new ResourceConfig();
rc.packages("magic.app.resource");
rc.register(magic.app.main.CorsSupportFilter.class);
final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI),rc);
/* SOME NON-RELEVANT CODE DOWN HERE */
}
}
And this filter class which I'm trying to register in the initialization class:
package magic.app.main;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
public class CorsSupportFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest req, ContainerResponse contResp) {
ResponseBuilder resp = Response.fromResponse(contResp.getResponse());
resp.header("Access-Control-Allow-Origin", Configuration.getHttpAllowOrigin())
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
String reqHead = req.getHeaderValue("Access-Control-Request-Headers");
if(null != reqHead && !reqHead.equals(null)){
resp.header("Access-Control-Allow-Headers", reqHead);
}
contResp.setResponse(resp.build());
return contResp;
}
}
When I run the app I get this piece of log:
WARNING: A provider magic.app.main.CorsSupportFilter registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider magic.app.main.CorsSupportFilter will be ignored.
I'm working with gradle and this is my app's Gradle build file:
apply plugin: 'java'
repositories{
mavenCentral()
}
dependencies{
// IP2C
compile fileTree(dir: 'libs', include: '*.jar')
// Jersey + Grizzly
compile 'org.glassfish.jersey:jersey-bom:2.4.1'
compile 'org.glassfish.jersey.containers:jersey-container-grizzly2-http:2.4.1'
// Jersey
compile 'com.sun.jersey:jersey-core:1.17.1'
compile 'com.sun.jersey:jersey-server:1.17.1'
// JSON
compile 'org.codehaus.jackson:jackson-core-asl:1.9.13'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
compile 'org.codehaus.jackson:jackson-xc:1.9.13'
compile 'com.googlecode.json-simple:json-simple:1.1.1'
// Jersey + JSON
compile 'com.sun.jersey:jersey-json:1.17.1'
compile 'com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.3.0-rc1'
// Postgres
compile 'com.jolbox:bonecp:0.8.0.RELEASE'
compile 'postgresql:postgresql:9.1-901-1.jdbc4'
// Mail
compile 'javax.mail:mail:1.5.0-b01'
}
回答1:
You're mixing 2 versions of Jersey (1.x and 2.x) in your app. In your Main
class you're using Jersey 2.x (package prefix is org.glassfish.jersey
) and your ContainerResponseFilter
is an implementation of Jersey 1.x proprietary API.
If you want to use Jersey 2.x the filter should implement ContainerResponseFilter from JAX-RS 2.0.
In case you want to stick with Jersey 1.x you should change registration in your Main
class (and also use grizzly container module from Jersey 1.x):
final ResourceConfig rc = new PackagesResourceConfig("magic.app.resource");
rc.getContainerResponseFilters().add(CorsSupportFilter.class);
来源:https://stackoverflow.com/questions/19920119/problems-trying-to-add-a-filter-to-a-grizzlyjersey-app