L'exécution de la ActionListener d'un (Primefaces) élément de menu conduit à une IllegalStateException
Dans JSF adossés à des haricots, j'ai eu une IllegalStateException
quand la par programme action ajoutée écouteur un par programme ajouté Primefaces élément de menu est appelé. J'ai essayé les deux request
et session
portée, mais les deux mènent à la même erreur. Évidemment il y a besoin, en fonction de la trace de la pile à restaurer la vue lorsqu'une action listener est exécuté et j'ai laissé mon ToolbarBean
mettre en œuvre Serializable
sans effet différent. Que dois-je prendre en compte pour obtenir que cela fonctionne?
Interface utilisateur définition
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<title>TITLE</title>
</h:head>
<h:body>
<h:form>
<p:menu model="#{toolbarBean.model}" type="tiered" />
</h:form>
</h:body>
</html>
Soutenu bean fournissant le menu
@Named
@Scope("request")
public class ToolbarBean implements Serializable {
private static final long serialVersionUID = -8556751897482662530L;
public ToolbarBean() {
model = new DefaultMenuModel();
MenuItem item;
//Direct menu item
item = new MenuItem();
item.setValue("Menuitem 1");
item.addActionListener(new ActionListener() {
@Override
public void processAction(ActionEvent event)
throws AbortProcessingException {
System.out.println(event.toString());
}
});
model.addMenuItem(item);
item = new MenuItem();
item.setValue("Menuitem 2");
item.addActionListener(new ActionListener() {
@Override
public void processAction(ActionEvent event)
throws AbortProcessingException {
System.out.println(event.toString());
}
});
model.addMenuItem(item);
}
private MenuModel model;
public MenuModel getModel() {
return model;
}
}
Exception lorsque vous cliquez sur l'un des boutons de menu
javax.faces.FacesException: java.lang.IllegalStateException: java.lang.InstantiationException: id.co.sofcograha.baseui.ToolbarBean$1
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1284)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:673)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1290)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:673)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1290)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:673)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1290)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:673)
at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:297)
at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:177)
at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:119)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:438)
at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:144)
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:284)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:182)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
Vous devez vous connecter pour publier un commentaire.
EL (lire: la réflexion), impossible d'accéder à/construction de anonyme de classes. Refactoriser en fullworthy classes.
Donc, remplacer
par
et
Voir aussi:
Il ressemble à une restriction supplémentaire est que l'ActionListener classe ont pas de constructeur arguments, quel genre de ajoute l'insulte à l'injure ici. Aussi loin que je puisse voir la addActionListener probablement juste stocke le nom de la classe de l'objet transmis.
En fait, si l'intention était de faire de ce port d'écoute inutilisable par la prévention de toutes les données transmises à l'auditeur de votre backing bean ils pouvaient difficilement pu faire plus.
Vous obtenez un autre IllegalStateException si vous essayez de sous-classement MenuItem.
Vous ne pouvez pas passer d'un objet contenant des données à MenuItem comme une valeur, il nécessite une Chaîne de caractères.
Il ne semble pas permettre à l'auditeur interne de la classe.
Mais je crois que j'ai craqué, en mettant les données nécessaires dans les attributs de la carte de l'élément de menu.
Voici ce que je me suis retrouvé avec:
}
Pour configurer un élément:-
Avec:
(fonctionne comme un intérieur de classe, mais ne peut pas être anonyme).