[英]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。 它不適用於過濾器。 如果您堅持使用它,請按照此處提供的答案正確執行:
現在關於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.