2012-01-20 24 views
1

前兩天我寫了這個問題: How can I retrieve an object on @WindowScoped? 和BalusC回答了一些建議,現在我有一些問題要了解,如果我的問題是WindowScoped中的對象存儲正確或我的代碼檢索它是錯誤的!如何檢查使用@WindowScoped存儲的對象是否正確存儲?

那麼,正如我所說,我有一個對象,我存儲在@WindowScoped註釋,但我可以只在第一次檢索這個對象!爲什麼?

我只是有一個疑問:MyFaces的CODI擴展可以以某種方式配置?或者我可以用它簡單地將jar文件添加到我的項目中?

然而,這些都是我的部分代碼,因爲我不知道問題出在哪裏:

LogicBean.java(我應該retrive對象):

@ManagedBean (name="logicBean") 
@WindowScoped 
public class LogicBean implements Serializable 
{ 
    String pageIncluded; 
    // getter and setter methods 

    public String action(String value) 
    { 
     setPageIncluded(value); 

     return "include"; 
    } 
} 

include.xhtml:

<ui:include src="#{logicBean.pageIncluded}"/> 

ProgettiController.java

@ManagedBean(name = "progettiController") 
@SessionScoped 
public class ProgettiController implements Serializable { 

    private FacesContext context = FacesContext.getCurrentInstance(); 
    private LogicBean logicBean = context.getApplication().evaluateExpressionGet(context, "#{logicBean}", LogicBean.class); 
    //getter and setter methods 

    public void testMethod() 
    { 
     logicBean.action("WEB-INF/jsf/page1.xhtml"); 
    } 
} 

我也試過用@ManagedProperty(「#{} logicBean」),並設置範圍爲WindowScoped但沒有什麼變化......


編輯:後一些新的試驗,我發現一個奇怪的問題,我有.xhtml我添加了#{progettiController.logicBean.getPageIncluded()}和#{logicBean.getPageIncluded()}來檢查這兩個字段嗎?

那麼,當我第一次加載應用程序變量被正確設置,我看到我想要的,第二次第一次變量設置爲新值,但第二次是空的,我沒有看到什麼,但現在來的奇怪的事情......如果我再試一試的應用程序,我應該打開的index.xhtml在那裏我有一些形式是這樣的:

<h:form> 
    <h:commandLink action="#{logicBean.action('/WEB-INF/jsf/progetti/List.xhtml')}" value="Show All Progetti Items"/> 
</h:form> 

,哪個是結果? 第一個變量保持設置舊值(錯誤),但第二個設置正確,所以我可以像我一樣查看頁面! 如果有人能幫助我,我會永遠感謝他/她!

回答

1

CODI是CDI的擴展,因此您應該通過CDI @Named註釋而不是JSF @ManagedBean註釋來管理您的bean。然後你可以通過CDI @Inject註釋注入另一個bean。下面的例子應該工作:

import javax.inject.Named; 
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowScoped; 

@Named 
@WindowScoped 
public class LogicBean implements Serializable { 
    // ... 
} 

import javax.enterprise.context.SessionScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

@Named 
@SessionScoped 
public class ProgettiController implements Serializable { 

    @Inject 
    private LogicBean logicBean; 

    // ... 
} 
+0

@ BalusC:問題是,我使用LogicBean許多方法,所以我想只添加:
上下文= FacesContext.getCurrentInstance() ;
logicBean = context.getApplication()。evaluateExpressionGet(context,「#{logicBean}」,LogicBean.class);
在使用它的方法中,但沒有任何變化......但問題是,xhtml頁面沒有檢索到logicBean! – Filippo1980

+0

你說得對。我完全忽略了CODI是CDI的延伸。您應該通過CDI批註而不是JSF批註來管理您的bean。然後你可以使用CDI'@Inject'來注入另一個bean。這與範圍的差異無關。我編輯了我的答案。 – BalusC

+0

@ BalusC:好的,你說得對,很明顯......現在它的工作原理......控制器中的錯誤也導致了xhtml頁面中的問題......再次感謝! – Filippo1980