2016-10-27 43 views
0

我有我的休息服務中的一類生產企業,其就是如此執行類:如何注入的HttpServletRequest或會話從CDI

public class WebResources{ 


    @Produces 
    @RequestScoped 
    public FacesContext produceFacesContext() { 
     return FacesContext.getCurrentInstance(); 
    } 

    @Produces 
    public Logger produceLog(InjectionPoint injectionPoint) { 
     return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
    } 
} 

現在,我希望生產礦井的目的是通過使用HttpServletRequest的或HttpSession作爲參數。是這樣的:

@Produces 
@RequestScoped 
public MyObject getSecurityContext(InjectionPoint injectionPoint) 
{ 
    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
    return Utils.getMyObject(request); 
} 

我接收上部署階段的錯誤是以下內容:

ERROR [org.jboss.as.cli.CommandContext] { 「JBAS014671:無法服務」=> { 「jboss.deployment.unit。\」zuora.ear \「。WeldStartService」=>「service jboss.deployment.unit。\」zuora.ear \「中的org.jboss.msc.service.StartException。WeldStartService:無法啓動服務 引起:org.jboss.weld.exceptions.DefinitionException:WELD-001406無法注入[method]的[參數1] @Produces @RequestScoped public it.infocert.zuora.rest.util.WebResources.getSecurityContext(InjectionPoint)in一個非@依賴「JBAS014671:失敗的服務」=> {「jboss.deployment.unit。\」zuora.ear \「。WeldStartService」=>「org.jboss.msc.service.StartException in service jboss.deployment .unit。\「zuora.ear \」。WeldStartService:啓動服務失敗 引起:org.jboss.weld.exceptions.DefinitionException:WELD-001406無法注入[method] @Produces @RequestScoped的[parameter 1] public it .info

+1

據我所知,沒有辦法通過單獨使用Weld來注入請求,我知道和使用的方式是deltaspike的RequestResponseHolderFilter。通過使用這個過濾器,你可以用限定符@Deltaspike注入HttpRequest。有關更多信息,請參閱https://deltaspike.apache.org/documentation/servlet.html。如果你不想/可以使用deltaspike,你可以查看它的servlet模塊源代碼。這很簡單。您需要獲取每個請求並將其保存在ThreadLocal變量中。 – temaleva

+0

順便說一句:你可以注入'HttpServletRequest' CDI> = 1.1 – chkal

回答

1

您應該從方法簽名中刪除InjectionPoint參數。如果由於多個注入點將獲得相同的(請求範圍的)實例而生成請求範圍的bean,則不能使用我們的InjectionPoint。您沒有在代碼中使用注入點,因此可以安全地刪除它。

+0

這對我來說沒問題,但我怎麼可以引用HttpServletRequest呢? –

+0

在你的'getSecurityContext'中,你從FacesContext獲得請求。那麼爲什麼你需要爲此注入點? – chkal

+0

其實這段代碼不起作用; FacesContext currentInstance = FacesContext.getCurrentInstance(); return null –