現在、RichFacesでJava EE 6/JSF 2.1を評価しています。
として宣言されているBean
_@ManagedBean
@ViewScoped
_
CDI BeanにはViewScopeがないため、Beanを次のように宣言しようとしました。
_@Named
@ConversationScoped
_
ステップ1で設定された(チェックされた)値が使用できなくなったため、ステップ3で処理が失敗します。
Conversation.begin()
およびConversation.end()
メソッドを使用する必要がありますか?
もしそうなら、それらを呼び出すための良い場所はどこでしょうか?
JSF 2.2にアップグレードできる場合は、すぐに実行してください。 CDIにネイティブの _@ViewScoped
_ アノテーションを提供します。
_import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
_
または、インストール OmniFaces 独自のCDI互換性 _@ViewScoped
_ をインストールします。動作する_@PreDestroy
_(JSF _@ViewScoped
_で破損) 。
_import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
_
別の方法は、JSF 2.0/2.1 _@ViewScoped
_を透過的にCDIにブリッジする MyFaces CODI をインストールすることです。これは、自動生成されたリクエストパラメータをURLに追加するだけです(_@ConversationScoped
_のように)。
_import javax.faces.bean.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
_
_@ConversationScoped
_を本当に使用する必要がある場合は、実際にそれを手動で開始および終了する必要があります。 _@Inject
_ a Conversation
を実行し、_@PostConstruct
_でbegin()
を呼び出し、最後のステップでend()
を呼び出す必要があります。会話、通常は新しいビューにリダイレクトするアクションメソッド。
_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";
}
}
_
CDI拡張機能を利用して独自のスコープを作成し、コンテキストを実装して@NormalScope
を使用できるようになると思います。
AfterBeanDiscovery
を起動します@Observes
し、コンテキスト実装を追加できますContextual
を使用して、FacesContext
ViewRoot
Map
からBeanを名前で取得し、各ajaxコールバック後にそれを返しますCreationalContext
を使用してFacesContext
ViewRoot
Map
に作成しますより詳細な説明については、このリンクをお勧めします: http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/
会話を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";
}
}
Java EEスタック機能: DeltaSpike への拡張を保持するプロジェクトがあります。これはSeam 3、Apache CODIの統合です。他のものの上に、 @ViewScoped to CDI。これは古い記事であり、現在バージョン1.3.0に達しています。