Ich versuche, ein JSF-Formular mit einem JPA-Backend zu erstellen. Die Klassenstruktur beruht stark auf Vererbung. Ich habe versucht, die JSF-Formulare modular zu gestalten, damit ich je nach der Klasse des erstellten Objekts verschiedene Teile hinzufügen kann. Jetzt bin ich auf das Problem gestoßen, dass ich den Controller der Unterklasse brauche, um alle Daten zu setzen. Also wollte ich zuerst den Controller-Identifier als eine Variable setzen und dann das Formularstück der Superklasse (und innerhalb der Superklasse darüber usw.)JSF-Controller als Variable
(die Includes sind noch nicht im Code)
<h:body>
<h:form>
<h1><h:outputText value="Make FieldPlayer"/></h1>
<h:panelGrid columns="2">
<c:set var="controller" value="#{fieldPlayerController}" scope="request" />
<h:outputLabel value="Name:" for="naam" />
<h:inputText id="naam" value="#{controller.fieldPlayer.name}" title="Naam" />
<h:outputLabel value="Birthday:" for="prijs" />
<h:inputText id="prijs" value="#{controller.birthday}" title="Prijs"/>
<h:commandButton value="save" action="#{controller.add()}"></h:commandButton>
</h:panelGrid>
</h:form>
</h:body>
Aber ich bin immer folgende Fehlermeldung: /add_fieldPlayer.xhtml @ 17,94 value = "# {controller.fieldPlayer.name}": Ziel nicht erreichbar, Bezeichner 'Controller' aufgelöst auf null
Habe ich irgendwo einen Fehler gemacht? Oder können Controller nicht in einer Variablen eingestellt werden?
Controller-Code:
@Named(value = "fieldPlayerController")
@SessionScoped
public class FieldPlayerController extends PlayerController<FieldPlayer> {
public FieldPlayerController() {
super(FieldPlayer.class);
}
}
@Named(value = "playerController")
@Dependent
public abstract class PlayerController<T> implements Serializable {
@EJB
private AbstractFacade<T> facade;
private T player;
public PlayerController(Class<T> entityClass) {
try {
this.player = entityClass.newInstance();
} catch (InstantiationException | IllegalAccessException ex) {
Logger.getLogger(PlayerController.class.getName()).log(Level.SEVERE, null, ex);
}
}
public T getPlayer() {
return player;
}
public void setPlayer(T p) {
this.player = p;
}
public List<T> findAll() {
return this.facade.findAll();
}
public String add() throws ParseException {
this.facade.create(player);
try {
this.player = (T) player.getClass().newInstance();
} catch (InstantiationException | IllegalAccessException ex) {
Logger.getLogger(PlayerController.class.getName()).log(Level.SEVERE, null, ex);
}
return "index";
}
...
Vielen Dank im Voraus
Sie sollten post Ihren Controller Code auch. –