簡體   English   中英

在JSF 2.0中注入Bean

[英]Injecting Beans in JSF 2.0

我有一個Session scoped bean

import javax.faces.bean.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable{

我在一個過濾器中進行了對象...

public class FiltroSeguridad implements Filter{

@Inject
private SessionBean sessionBean;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  HttpServletRequest httpRequest = (HttpServletRequest) request;
  sessionBean.setRutaRedirect(httpRequest.getRequestURI());
}
}

但是,我在下一次互動中使用SessionBean ...

@Model
public class CuentaUsuarioWebBean implements Serializable{
 @Inject
 private SessionBean sessionBean;

public void loginUsuario() throws IOException{
   sessionBean.getRutaRedirect();
}

}

但屬性getRutaRedirect()返回null

我通過CDI注釋更改導入它仍然不起作用( javax.enterprise.context.SessionScoped ),與JSF注釋( javax.faces.bean.ManagedBean@ManagedProperty )相同。

謝謝。

PD:對不起我的英文!

您不能混合使用javax.faces.bean.SessionScoped for JSF的兩個包中的注釋,並為CDI import javax.inject.Named 兩者都反映了不同的注射機制,不能在同一個豆上混合。 您必須從同一個包中選擇兩個注釋(對於Injection和Bean Scoping)。 使用相應包中的以下集

對於基於CDI的bean定義

javax.enterprise.context.SessionScoped //for bean scoping
javax.inject.Named //for bean declaration
javax.inject.Inject //for injection

對於基於JSF的bean定義

javax.faces.bean.SessionScoped //for bean scoping
javax.faces.bean.ManagedBean //for bean declaration
javax.faces.bean.ManagedProperty //for bean injection

編輯:現在我更好地理解您的要求,使用以下構造來注入JSF托管bean

 @ManagedProperty(value="#{yourBeanName}")
 SessionBean yourSessionBean;

另請注意,在JSF中,您只能注入范圍比目標范圍更廣的bean,例如,您可以將@SessionScoped bean注入@RequestScoped bean,而不是相反

但由於不推薦使用JSF托管bean,因此最好使用CDI托管bean。 在這種情況下,您可以在更寬的范圍內注入更短的范圍豆

忘記托管bean。 它不適用於過濾器。 如果您堅持使用它,請按照此處提供的答案正確執行:

如何在JSF中實現登錄過濾器?

現在關於CDI,如果你問題是特定值是null並且你已經通過實際獲得NPE左右來驗證這一點(因為例如Eclipse調試器有時會弄錯)。 然后仔細檢查你是否使用了kolossus所描述的正確的SessionScoped,並檢查了BalusC所說的內容(beans.xml)。

查看CDI是否正常工作的一個好方法是向經理詢問bean。 將此調試代碼放在某處並嘗試:

@Inject
BeanManager manager;

@PostConstruct
private void test() {
    Bean<?> bean = (Bean) manager.resolve(manager.getBeans("ANY_NAMED_BEAN_EL_NAME"));
        System.out.println(bean);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM