2016-06-10 105 views
1

我有澤西由灰熊提供。如何向澤西島注入灰熊請求ContainerRequestFilter

我有一個ContainerRequestFilter實現類。但是,該類爲所有傳入請求創建一次。因此,請執行以下操作:

public class EndpointRequestFilter implements ContainerRequestFilter { 
    @Context 
    private org.glassfish.grizzly.http.server.Request requestContext; 

    public void filter(ContainerRequestContext req) throws IOException { 
     // remove for sake of example 
    } 
} 

requestContext爲空。我可以將上下文注入到被調用的實際端點中,但這相當粗糙和醜陋,對我來說真的沒有用處;因爲我想記錄各種請求。理想情況下,希望在請求的ResponseFilter端獲得此Request對象。

必須有一個簡單的方法來做到這一點。到目前爲止,我所見過的所有問題/答案對於Grizzly都不起作用,或者注入了REST端點調用的方法。我不想在我的數百種方法中加入這個方法,只是因爲我想獲取IP地址!

那麼這裏的關鍵是什麼?我錯過了什麼?

回答

2

我很驚訝,你甚至得到了應用程序運行,以達到您可以找出請求爲空的點。無論何時我試圖運行它,我都會在啓動時遇到異常,並說沒有請求範圍,所以請求無法注入,這正是我所期望的。雖然我無法複製NPE,但我認爲這個解決方案仍然可以解決您的問題。

所以Request是一個請求作用域對象,因爲它在每個請求上都會發生變化。但過濾器本身就是一個單身人士。所以你需要做的是懶惰地檢索它。爲此,我們可以使用javax.inject.Provider作爲懶惰檢索機制。

回過頭來看看這個點在我的第一個段落,這是例外,我得到了在啓動時

java.lang.IllegalStateException:沒有內部的請求範圍。

這很有意義,因爲Request需要與請求範圍相關聯,並且在啓動時沒有。請求範圍僅在請求期間存在。

那麼什麼使用Provider呢,允許我們嘗試並抓住Request當存在請求範圍。

public static class Filter implements ContainerRequestFilter { 

    @Context 
    private javax.inject.Provider<Request> requestProvider; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     final Request request = requestProvider.get(); 
     System.out.println(request.getRemoteAddr()); 
    } 
} 

我測試過了,它按預期工作。

另請參見:

+0

好東西謝謝。讓它工作的關鍵是將其包裝在Provider類中。這完成了這個伎倆。 –

+0

@peeskillet驚人的解決方案,非常感謝! –