Ich evaluiere derzeit Java EE 6/JSF 2.1 mit RichFaces.
Eine Bohne, die als deklariert ist
@ManagedBean
@ViewScoped
Da CDI-Beans keinen ViewScope haben, habe ich versucht, die Bean als zu deklarieren:
@Named
@ConversationScoped
Nun schlägt die Verarbeitung in Schritt 3 fehl, da der in Schritt 1 festgelegte Wert (geprüft) nicht mehr verfügbar ist.
Muss ich die Methoden Conversation.begin()
und Conversation.end()
verwenden?
Wenn ja, wo wäre ein guter Ort, um sie anzurufen?
Wenn Sie ein Upgrade auf JSF 2.2 durchführen können, tun Sie es sofort. Es bietet eine native @ViewScoped
Anmerkung für CDI.
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
Alternativ können Sie/- OmniFaces installieren, das eine eigene CDI-kompatible @ViewScoped
enthält, einschließlich eines funktionierenden @PreDestroy
(der bei JSF @ViewScoped
defekt ist).
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
Eine andere Alternative ist die Installation von MyFaces CODI , die JSF 2.0/2.1 @ViewScoped
transparent mit CDI verbindet. Dadurch wird der URL nur ein automatisch generierter Anforderungsparameter hinzugefügt (wie @ConversationScoped
).
import javax.faces.bean.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
Wenn Sie wirklich @ConversationScoped
verwenden müssen, müssen Sie tatsächlich anfangen und es beenden. Sie müssen im letzten Schritt der Konversation @Inject
eine Conversation
und begin()
in @PostConstruct
und end()
aufrufen, normalerweise eine Aktionsmethode, die auf eine neue Ansicht umleitet.
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";
}
}
Ich denke, Sie können von der CDI-Erweiterung profitieren, um Ihren eigenen Bereich zu erstellen, sodass Sie den Kontext implementieren und den @NormalScope
verwenden können.
AfterBeanDiscovery
aus@Observes
dieses Ereignis verwenden und Ihre Kontextimplementierung hinzufügenContextual
, um Ihre Bean von FacesContext
ViewRoot
Map
mit ihrem Namen abzurufen und es zurückzugeben nach jedem Ajax-Aufruf zurück CreationalContext
, wenn der Bean-Name aus dem ersten Schritt nicht gefunden wurde, um ihn in der FacesContext
ViewRoot
Map
zu erstellen. Für eine ausführlichere Erklärung empfehle ich diesen Link: http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/
Injizieren Sie die Konversation in Ihre Bean und starten Sie die Konversation in der @PostConstructor
-Methode, wenn die Konversation vorübergehend ist.
Beenden Sie nach dem Löschen des Datensatzes Ihr Gespräch und navigieren Sie zu Ihrer Zielseite. Wenn Sie ein Gespräch beginnen. Hier ist ein Beispiel
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";
}
}
Es gibt ein Projekt, das Erweiterungen der Java EE-Stack-Funktionen enthält: DeltaSpike . Es ist eine Konsolidierung von Seam 3, Apache CODI. Es enthält unter anderem @ViewScoped in CDI. Dies ist ein alter Artikel und hat inzwischen die Version 1.3.0 erreicht