Vous n'êtes pas connecté. Connexion
|
|
FAQ JSF2 : solutions aux erreurs les plus courantesDe $1Table des matières
Q : je suis perdu avec les imports pour les Scoped, pour Named, pour Managed Bean
Avec :
Il faut importer les deux classes depuis le package javax.faces.xxx
Il faut importer depuis CDI les deux classes (soir javax.enterprise.xxx) Q : Il ne s'affiche rien dans ma datatable et je n'ai pas de message d'erreur
Q : ma table PrimeFaces ne se trie pas
Q : j'ai une erreur au déploiement EJBvalidator ou EJBBundle errors
Q : J'ai une erreur Caused by: java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed
Solution donc : ajouter un événement preRenderView dans la page qui contient la dataTable (ligne 8) : <h:head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link href="./resources/css/default.css" rel="stylesheet" type="text/css" /> <link href="./resources/css/cssLayout.css" rel="stylesheet" type="text/css" /> </h:head> <h:body> <f:event type="javax.faces.event.PreRenderViewEvent" listener="#{customerMBean.preRenderView}"/> <f:view> <h:form> <h1><h:outputText value="List"/></h1> <p:dataTable value="#{customerMBean.customers}" var="item" emptyMessage="No customer found with given criteria" widgetVar="customerTable" paginator="true" rows="10"> Ajouter dans la méthode envoyée par l'événement, il faut la forcer à créer une session bidon avant toutes choses : @ManagedBean @ViewScoped public class CustomerMBean implements Serializable { @EJB private DiscountCodeManager discountCodeManager; @EJB private CustomerManager customerManager; /* Client courant dans la session, utilisé pour afficher ses détails ou * pour faire une mise à jour du client modifié dans la base */ private Customer customer; private List<Customer> customers; /** * Id du client dont on veut les détails. */ private int idDetails; public void preRenderView() { HttpSession session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true ); //tune session params, eg. session.setMaxInactiveInterval(..); //perform other pre-render stuff, like setting user context... } Q : comment marche le ConversationScoped ?
Voici un exemple d'utilisation : on ajoute @ConversationScoped dans le backing bean et on injecte une variable de type Conversation. Puis on appelle conversation.begin() et conversation.end() pour contrôler la création et la suppression de l'instance du bean. Exemple (voir lignes 7, 10, 11, 16, 27...) : import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.inject.Inject; @Named(value = "customerMBean") @ConversationScoped public class CustomerMBean implements Serializable { @Inject Conversation conversation; @EJB private DiscountCodeManager discountCodeManager; public String showDetails(Customer customer) { conversation.begin(); this.customer = customer; currentDiscoutCode = customer.getDiscountCode().getDiscountCode().toString(); return "CustomerDetails"; } ... public String update() { DiscountCode code = discountCodeManager.getDiscountCodeFromStringCode(currentDiscoutCode); customer.setDiscountCode(code); customer = customerManager.update(customer); conversation.end(); return "CustomerList"; }
|
Powered by MindTouch Deki Open Source Edition v.8.08 |