2014-01-09 36 views
2

我無法讓我的請求過濾器被觸發。我將jetty 9.1作爲嵌入式服務器運行。請求過濾器在Embedded Jetty的Jersey 2中不工作

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)

+0

你能告訴我們如何配置/啓動Jetty嗎? –

+0

是的,更新的問題。 –

回答

4

的問題是,它定義了REST端點類不能被實例化,因爲 - 在我的情況下 - 實例化取決於必須在請求過濾器中設置的內容

但是,端點類實例化前爲過濾器被調用。爲了首先運行過濾器,必須註明@PreMatching

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

您是否使用此過濾器來提供自定義注射或類似的東西? –

+0

我用它來初始化一些線程本地(例如,一個監視由請求觸發的數據庫訪問數量的計數器)。 –

+0

感謝您的澄清。 –

0

爲了能夠在與新澤西州的REST服務的自包含的Jetty jar文件跨域請求(允許從揚鞭-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"); 
} 

}

,並引用它在你的主App類:

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(); 
    } 
} 

}

通過我們必須嵌入與碼頭過濾器的類似的方式和球衣。希望這會使用完整。