我无法触发我的请求过滤器。我将jetty9.1作为嵌入式服务器运行。

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class MyFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext arg0) throws IOException {
        System.out.println("HEY HO");
    }
}

我在ResourceConfig中注册了这个类,也尝试注册包。它只是被忽略了。这是一个错误,还是我错过了什么?

这就是我开始码头的方式:

Weld weld = new Weld();
WeldContainer container = weld.initialize();

URI baseUri = UriBuilder.fromUri("http://localhost/").port(8080).build();
ResourceConfig config = ResourceConfig.forApplicationClass(MyApplication.class);

Server server = JettyHttpContainerFactory.createServer(baseUri, config);

(MyApplication扩展ResourceConfig和调用 this.package(...)this.register(MyFilter.class) 在构造函数中。

有帮助吗?

解决方案

问题是定义REST端点的类无法实例化,因为-在我的情况下-实例化取决于必须在请求过滤器中设置的东西。

但是,端点类是实例化的 以前 过滤器被调用。为了首先运行过滤器,必须对其进行注释 @PreMatching.

@Provider
@PreMatching
public class MyFilter implements ContainerRequestFilter {
    ...
}

其他提示

使用Jersey REST服务在自包含的Jetty jar文件中启用跨源请求(允许来自Swagger-UI的调用)。创建一个CORSResponseFilter类:

public class CORSResponseFilter implements ContainerResponseFilter {

public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        throws IOException {

    MultivaluedMap headers = responseContext.getHeaders();

    headers.add("Access-Control-Allow-Origin", "*");
    //headers.add("Access-Control-Allow-Origin", "http://podcastpedia.org"); //allows CORS requests only coming from podcastpedia.org
    headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
    headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
}

}

并在您的主应用程序类中引用它:

public class App {
public static void main(String[] args) throws Exception {
    URI baseUri = UriBuilder.fromUri("http://localhost/").port(8080).build();
    ResourceConfig config = new ResourceConfig(API.class);
    config.register(CORSResponseFilter.class);
    Server jettyServer = JettyHttpContainerFactory.createServer(baseUri, config);

    try {
        jettyServer.start();
        jettyServer.join();
    } finally {
        jettyServer.destroy();
    }
}

}

通过类似的方式,我们必须嵌入码头和泽西的过滤器。希望这将使用满。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top