2017-06-09 6 views
0

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

+0

Sie sollten post Ihren Controller Code auch. –

Antwort

0

Soweit ich sehen kann: Ihr Controller fieldPlayerController nicht die Eigenschaft besitzen fieldPlayer, verwenden Spieler statt:

<h:inputText id="naam" value="#{controller.player.name}" title="Naam" /> 

Wenn der Controller auf null validiert, versuchen param zu verwenden:

<f:param name = "controller" value = "#{fieldPlayerController}" /> 

Aber der param Tag nicht bietet ein Umfang Attribut ...