JSF控制器作为变量

时间:2017-06-09 10:17:11

标签: java jsf jsf-2 ejb

我正在尝试使用JPA后端创建一个JSF表单。 类结构在很大程度上依赖于继承。 我试图让JSF表单模块化,因此我可以根据所制作对象的类包含不同的部分。现在我偶然发现了我需要子类控制器来设置所有数据的问题。所以我希望首先将controller-identifier设置为变量,然后包含超类的表单块(并在其上面的超类之类,等等)

(包含在代码中尚未包含)

<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 value =“#{controller.fieldPlayer.name}”:目标无法访问,标识符'controller'已解析为null

我在某个地方犯了错误吗?或者不能在变量中设置控制器?

控制器代码:

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

提前致谢

1 个答案:

答案 0 :(得分:0)

据我所知:你的控制器 fieldPlayerController 不拥有属性 fieldPlayer ,而是使用 player

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

如果 controller 仍然验证为null,请尝试使用 param

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

param 标记未提供范围属性...