Java JSF控制器作为变量
我正在尝试创建一个带有JPA后端的JSF表单。 类结构严重依赖于继承。 我试图将JSF表单模块化,以便根据所生成对象的类别包含不同的部分。现在我偶然发现了一个问题,我需要子类的控制器来设置所有数据。因此,我希望首先将控制器标识符设置为变量,然后包括超类的表单部分(以及在超类的表单部分之上,以此类推) (代码中还没有包含这些内容)Java JSF控制器作为变量,java,jsf,jsf-2,ejb,Java,Jsf,Jsf 2,Ejb,我正在尝试创建一个带有JPA后端的JSF表单。 类结构严重依赖于继承。 我试图将JSF表单模块化,以便根据所生成对象的类别包含不同的部分。现在我偶然发现了一个问题,我需要子类的控制器来设置所有数据。因此,我希望首先将控制器标识符设置为变量,然后包括超类的表单部分(以及在超类的表单部分之上,以此类推) (代码中还没有包含这些内容) 但我得到了以下错误: /add_fieldPlayer.xhtml@17,94 value=“#{controller.fieldPlayer.name}”:无法访
但我得到了以下错误:
/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";
}
...
@Named(value=“fieldPlayerController”)
@会议范围
公共类FieldPlayerController扩展了PlayerController{
公共野战玩家控制器(){
超级(野手级);
}
}
@命名(value=“playerController”)
@依赖的
公共抽象类PlayerController实现可序列化{
@EJB
私人立面;
私人T播放器;
公共播放器控制器(类entityClass){
试一试{
this.player=entityClass.newInstance();
}catch(实例化异常| IllegalAccessException ex){
Logger.getLogger(PlayerController.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共T getPlayer(){
返回球员;
}
公共无效设置播放器(TP){
this.player=p;
}
公共列表findAll(){
返回这个.facade.findAll();
}
公共字符串add()引发ParseException{
this.facade.create(player);
试一试{
this.player=(T)player.getClass().newInstance();
}catch(实例化异常| IllegalAccessException ex){
Logger.getLogger(PlayerController.class.getName()).log(Level.SEVERE,null,ex);
}
返回“索引”;
}
...
提前感谢据我所知:您的控制器fieldPlayerController不拥有fieldPlayer属性,请改用player:
如果控制器仍然验证为null,请尝试使用参数:
但是param标记不提供scope属性…您也应该发布控制器代码。
@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";
}
...
<h:inputText id="naam" value="#{controller.player.name}" title="Naam" />
<f:param name = "controller" value = "#{fieldPlayerController}" />