2017-06-09 74 views
0

我想創建一個帶有JPA後端的JSF表單。這個類的結構很大程度上依賴於繼承。 我試圖讓JSF表單是模塊化的,所以我可以根據所創建對象的類別包含不同的部分。現在我偶然發現了我需要子類的控制器來設置所有數據的問題。所以我期望首先將控制器標識符設置爲變量,然後包含超類的表單部分(以及超類的表單部分等等)JSF控制器作爲變量

(包含代碼尚未包含)

<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> 

但我發現了以下錯誤: /add_fieldPlayer.xhtml @ 17,94值= 「#{} controller.fieldPlayer.name」:目標不可達,標識符 '控制器' 解析爲空

我是否在某處出錯?或者不能將控制器設置爲變量?

控制器代碼:

@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"; 
    } 
... 

在此先感謝

+0

你應該張貼您的控制器代碼也是如此。 –

回答

0

至於我可以看到:您的控制器fieldPlayerController沒有自己的財產fieldPlayer,使用球員代替:

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

如果仍控制器驗證爲空,嘗試使用PARAM

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

PARAM標籤不提供範圍屬性...