编程语言
首页 > 编程语言> > java – 试图将过滤器添加到Grizzly Jersey应用程序的问题

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