1

2日前に私はこの質問を書きました: @WindowScopedでオブジェクトを取得するにはどうすればよいですか? BalusCはいくつかの提案で答えましたが、私の問題がWindowScopedのオブジェクトが正しく保存されているのか、それを取得するためのコードが間違っているのかを理解するのに問題があります。

さて、私が言ったように、私は@WindowScopedアノテーションに保存したオブジェクトを持っていますが、このオブジェクトを取得できるのは初めてです!なんで?

私は疑問があります:MyFacesのCODI拡張機能は何らかの方法で構成できますか?または、プロジェクトにjarファイルを追加するだけで使用できますか?

ただし、問題がどこにあるのかわからないため、これらは私のコードの一部です。

LogicBean.java(取得する必要のあるオブジェクト):

@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として設定しようとしましたが、何も変更されません...


編集:いくつかの新しい試行の後、奇妙な問題を見つけました。include.xhtmlに、これら2つのフィールドをチェックするための#{progettiController.logicBean.getPageIncluded()}と#{logicBean.getPageIncluded()}を追加しました。

さて、初めてアプリケーションをロードすると、変数が正しく設定され、必要なものが表示されます。2回目は、最初の変数が新しい値で設定されていますが、2番目は空で、何も表示されません。奇妙なことが起こります...アプリを再試行する必要がある場合は、次のようなフォームがあったindex.xhtmlを開く必要があります。

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

結果はどれですか?最初の変数は古い値(間違った)で設定されたままですが、2番目の変数は正しく設定されているため、ページを確認できます。誰かが私を助けてくれるなら、私は彼/彼女に永遠に感謝します!

4

1 に答える 1

1

@NamedCODI は CDI の拡張であるため、JSF アノテーションではなくCDI アノテーションで Bean を管理する必要があります@ManagedBean@Injectその後、CDIアノテーションによって他の 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;

    // ...
}
于 2012-01-20T11:55:20.583 に答える