27

私は現在、RichFacesを使用してJava EE 6 /JSF2.1を評価しています。

として宣言されているBean

@ManagedBean
@ViewScoped
  1. IDセットを取得します(たとえば、削除操作を準備するため)。
  2. JSFを介して、確認ポップアップが表示されます。
  3. ユーザーが確認すると、deleteメソッドが呼び出され、手順1でIDが保存された行が削除されます。

CDI BeanにはViewScopeがないため、Beanを次のように宣言しようとしました。

@Named
@ConversationScoped

これで、ステップ1で設定された(チェックされた)値が使用できなくなったため、ステップ3で処理が失敗します。

Conversation.begin()Conversation.end()メソッドを使用する必要がありますか?

もしそうなら、それらを呼び出すのに良い場所はどこですか?

4

5 に答える 5

55

JSF 2.2にアップグレードできる場合は、すぐにアップグレードしてください。CDIのネイティブ@ViewScopedアノテーションを提供します。

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class Bean implements Serializable {
    // ...
}

または、 OmniFacesをインストールして、動作するもの(JSFで壊れている)@ViewScopedを含む独自のCDI互換性をもたらします。@PreDestroy@ViewScoped

import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;

@Named
@ViewScoped
public class Bean implements Serializable {
    // ...
}

もう1つの方法は、JSF 2.0/2.1をCDIに透過的にブリッジするMyFacesCODIをインストールすることです。@ViewScopedこれは、自動生成されたリクエストパラメータをURLに追加するだけです(@ConversationScopedそうするように)。

import javax.faces.bean.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class Bean implements Serializable {
    // ...
}

本当に使用する必要がある場合は@ConversationScoped、実際に手動で開始および終了する必要があります。会話の最後のステップで、を呼び出して呼び出す必要があります。通常は、新しいビューにリダイレクトする@InjectアクションメソッドConversationです。begin()@PostConstructend()

import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Named;

@Named
@ConversationScoped
public class Bean implements Serializable {

    @Inject
    private Conversation conversation;

    // ...

    @PostConstruct
    public void init() {
        conversation.begin();
    }

    public String submit() {
        // ...

        conversation.end();
        return "some.xhtml?faces-redirect=true";
    }

}

参照:

于 2013-01-17T17:33:55.913 に答える
6

CDI拡張機能を利用して独自のスコープを作成し、コンテキストを実装してを使用できるようになると思います@NormalScope

  • CDIは、AfterBeanDiscovery各Bean呼び出しの後にイベントを発生させます
  • @ObservesこのイベントにCDI拡張機能を使用して、コンテキスト実装を追加できます
  • スコープの実装では、次のことができます。
    1. Contextualから名前でBeanを取得し、各ajaxコールバック後にFacesContext ViewRoot Map返すために使用します
    2. CreationalContext最初のステップのBean名が見つからない場合に使用して、FacesContext ViewRoot Map

より詳細な説明については、次のリンクをお勧めします:http ://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/

于 2013-04-28T22:04:26.427 に答える
3

Beanに会話を注入し、@PostConstructor会話が一時的なものである場合は、メソッドで会話を開始します。

レコードを削除したら、会話を終了して目的のページに移動します。会話を始めるとき。これが例です

public class BaseWebBean implements Serializable {

private final static Logger logger = LoggerFactory.getLogger(BaseWebBean.class);
@Inject
protected Conversation conversation;

@PostConstruct
protected void initBean(){
}

public void continueOrInitConversation() {
        if (conversation.isTransient()) {
            conversation.begin();
            logger.trace("conversation with id {} has started by {}.", conversation.getId(), getClass().getName());
        }
    }

public void endConversationIfContinuing() {
        if (!conversation.isTransient()) {
            logger.trace("conversation with id {} has ended by {}.", conversation.getId(), getClass().getName());
            conversation.end();
        }
}

}

@ConversationScoped
@Named
public class yourBean extends BaseWebBean implements Serializable {
    @PostConstruct
    public void initBean() {
        super.initBean();
        continueOrInitConversation();
    }

    public String deleteRow(Row row)
    {
        /*delete your row here*/
        endConversationIfContinuing();
        return "yourDestinationPageAfter removal";
    }

}
于 2013-01-17T17:39:39.697 に答える
0

Java EEスタック機能の拡張を保持するプロジェクトがあります:DeltaSpike。これは、Seam 3、ApacheCODIを統合したものです。とりわけ、@ViewScopedがCDIに含まれています。これは古い記事であり、今ではバージョン1.3.0に達しています。

于 2015-05-06T13:19:20.237 に答える
-1

次を使用できます。

import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class PageController implements Serializable {

    private String value;

    public void setValue(String value) {
    this.value = value;
    }

    public String getValue() {
    return value;
    }

    public void execute() {
    setValue("value");
    }

    @PostConstruct
    public void init() {
    System.out.println("postcontructor");
    }

}
于 2015-04-18T13:01:43.130 に答える