java – 试图将过滤器添加到Grizzly Jersey应用程序的问题
作者:互联网
我有这个服务器初始化类:
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 */
}
}
我试图在初始化类中注册的这个过滤器类:
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;
}
}
当我运行应用程序时,我得到这块日志:
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.
我正在使用gradle,这是我的应用程序的Gradle构建文件:
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'
}
解决方法:
你在你的应用程序中混合了两个版本的Jersey(1.x和2.x).在您的Main类中,您使用的是Jersey 2.x(包前缀是org.glassfish.jersey),而ContainerResponseFilter是Jersey 1.x专有API的实现.
如果你想使用Jersey 2.x,过滤器应该从JAX-RS 2.0实现ContainerResponseFilter.
如果您想坚持使用Jersey 1.x,您应该更改Main类中的注册(并且还使用来自Jersey 1.x的grizzly容器模块):
final ResourceConfig rc = new PackagesResourceConfig("magic.app.resource");
rc.getContainerResponseFilters().add(CorsSupportFilter.class);
标签:java,http,header,jersey,grizzly 来源: https://codeday.me/bug/20190529/1176085.html