在 JSF 页面中引用时未构造 @Named("cc")
@Named("cc") not being constructed when referenced in JSF page
我有一个未正确呈现的 JSF 文件 (characters.xhtml),我怀疑这与未实例化的支持 bean (CharactersController) 有关。我可以呈现页面(意味着生成了所有 HTML 代码),但没有包含 bean 的任何详细信息,例如正在显示的“msg”属性 数据。至少,“msg”应该显示“hello”,或者理想情况下“列表大小为:0”。
最终,我想用这个 bean 从我的数据库中提取数据(DAO 本身在 REST 资源中单独工作,所以我认为这不是问题所在)。但就目前而言,我的 CharactersController bean 似乎没有实例化。我有一个 @PostConstruct 应该在创建 bean 时记录输出,但它没有出现在任何地方,这就是为什么我怀疑那里有问题。
在相关说明中,我有另一个用于不同 JSF 文件的托管 bean,它确实可以正确加载。它也是 ViewScoped。我能够从其各自的@PostConstruct 中看到日志。 (从其他较早的帖子来看,ViewScoped 可能是罪魁祸首,但它似乎不在这里,因为它确实适用于我的其他 bean。)
最后,如果我尝试创建引用任何方法的组件,我会收到空指针错误。我提出这个问题是因为我尝试通过 标签加载我的数据。
其他详情:
我正在使用 Jakarta EE 9、Glassfish 6.1 RC1、Java 11、IntelliJ、Maven 构建。
除了“dao”之外,我确实为 CharactersController 中的所有字段设置了 getter 和 setter。为了简洁起见,我省略了代码。
CharactersController - 托管 Bean
import jakarta.annotation.PostConstruct;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import xxx.dao.CharactersDao;
import xxx.CharactersEntity;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@Named("cc")
@ViewScoped
public class CharactersController implements Serializable {
private static final long serialVersionUID = 1L;
public CharactersController() {
}
@Inject
private CharactersDao dao;
private List<CharactersEntity> chars;
private CharactersEntity newChar;
private String msg = "hello";
private static final Logger logger = Logger.getLogger("CharactersController");
@PostConstruct
public void init(){
chars = dao.getAll();
msg = "list size is: " + chars.size();
logger.log(Level.INFO, "CC constructed: " + msg);
}
characters.xhtml - 小脸
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
>
<h:head>
</h:head>
<h:body>
<ui:composition template="/WEB-INF/templates/adminTemplate.xhtml">
<ui:define name="dataTable">
<h3>Msg: <h:outputText value="#{cc.msg}"/></h3>
<h:form>
<h:dataTable value="#{cc.chars}" var="char">
<f:facet name="header">
<h:outputText value="Characters"/>
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:outputText value="#{char.characterId}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Avatar"/>
</f:facet>
<h:outputText value="#{char.avatar}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Name"/>
</f:facet>
<h:outputText value="#{char.name}"/>
</h:column>
</h:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
HTML输出
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head id="j_idt2">
<title>RPG Admin</title></head><body>
<header>
<h1>admin</h1>
</header>
<nav>
<div class="admin-nav-row">
<div><a href="/rpg_xe/admin/home.xhtml">Home</a>
</div>
<div><a href="/rpg_xe/admin/characters.xhtml">Characters</a>
</div>
</div>
</nav>
<main>
<h3>Msg: </h3>
<form id="j_idt13" name="j_idt13" method="post" action="/rpg_xe/admin/characters.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt13" value="j_idt13" />
<table>
<thead>
<tr><th colspan="3" scope="colgroup">Characters</th></tr>
<tr>
<th scope="col">ID</th>
<th scope="col">Avatar</th>
<th scope="col">Name</th>
</tr>
</thead>
<tbody>
<tr><td></td><td></td><td></td></tr></tbody>
</table>
<input type="hidden" name="jakarta.faces.ViewState" id="j_id1:jakarta.faces.ViewState:0" value="-7288672771663122896:-6269118426931924221" autocomplete="off" />
</form>
</main>
<footer>footer</footer></body>
</html>
好的,既然你已经确认了:
“cc”不能用作托管 bean 名称,因为与内置对象“cc”(复合组件)有冲突。
“JavaServer Faces 中的单词 cc 是复合组件的保留字。”
https://javaee.github.io/tutorial/jsf-facelets005.html
我有一个未正确呈现的 JSF 文件 (characters.xhtml),我怀疑这与未实例化的支持 bean (CharactersController) 有关。我可以呈现页面(意味着生成了所有 HTML 代码),但没有包含 bean 的任何详细信息,例如正在显示的“msg”属性 数据。至少,“msg”应该显示“hello”,或者理想情况下“列表大小为:0”。
最终,我想用这个 bean 从我的数据库中提取数据(DAO 本身在 REST 资源中单独工作,所以我认为这不是问题所在)。但就目前而言,我的 CharactersController bean 似乎没有实例化。我有一个 @PostConstruct 应该在创建 bean 时记录输出,但它没有出现在任何地方,这就是为什么我怀疑那里有问题。
在相关说明中,我有另一个用于不同 JSF 文件的托管 bean,它确实可以正确加载。它也是 ViewScoped。我能够从其各自的@PostConstruct 中看到日志。 (从其他较早的帖子来看,ViewScoped 可能是罪魁祸首,但它似乎不在这里,因为它确实适用于我的其他 bean。)
最后,如果我尝试创建引用任何方法的组件,我会收到空指针错误。我提出这个问题是因为我尝试通过
其他详情: 我正在使用 Jakarta EE 9、Glassfish 6.1 RC1、Java 11、IntelliJ、Maven 构建。 除了“dao”之外,我确实为 CharactersController 中的所有字段设置了 getter 和 setter。为了简洁起见,我省略了代码。
CharactersController - 托管 Bean
import jakarta.annotation.PostConstruct;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import xxx.dao.CharactersDao;
import xxx.CharactersEntity;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@Named("cc")
@ViewScoped
public class CharactersController implements Serializable {
private static final long serialVersionUID = 1L;
public CharactersController() {
}
@Inject
private CharactersDao dao;
private List<CharactersEntity> chars;
private CharactersEntity newChar;
private String msg = "hello";
private static final Logger logger = Logger.getLogger("CharactersController");
@PostConstruct
public void init(){
chars = dao.getAll();
msg = "list size is: " + chars.size();
logger.log(Level.INFO, "CC constructed: " + msg);
}
characters.xhtml - 小脸
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
>
<h:head>
</h:head>
<h:body>
<ui:composition template="/WEB-INF/templates/adminTemplate.xhtml">
<ui:define name="dataTable">
<h3>Msg: <h:outputText value="#{cc.msg}"/></h3>
<h:form>
<h:dataTable value="#{cc.chars}" var="char">
<f:facet name="header">
<h:outputText value="Characters"/>
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:outputText value="#{char.characterId}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Avatar"/>
</f:facet>
<h:outputText value="#{char.avatar}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Name"/>
</f:facet>
<h:outputText value="#{char.name}"/>
</h:column>
</h:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
HTML输出
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head id="j_idt2">
<title>RPG Admin</title></head><body>
<header>
<h1>admin</h1>
</header>
<nav>
<div class="admin-nav-row">
<div><a href="/rpg_xe/admin/home.xhtml">Home</a>
</div>
<div><a href="/rpg_xe/admin/characters.xhtml">Characters</a>
</div>
</div>
</nav>
<main>
<h3>Msg: </h3>
<form id="j_idt13" name="j_idt13" method="post" action="/rpg_xe/admin/characters.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt13" value="j_idt13" />
<table>
<thead>
<tr><th colspan="3" scope="colgroup">Characters</th></tr>
<tr>
<th scope="col">ID</th>
<th scope="col">Avatar</th>
<th scope="col">Name</th>
</tr>
</thead>
<tbody>
<tr><td></td><td></td><td></td></tr></tbody>
</table>
<input type="hidden" name="jakarta.faces.ViewState" id="j_id1:jakarta.faces.ViewState:0" value="-7288672771663122896:-6269118426931924221" autocomplete="off" />
</form>
</main>
<footer>footer</footer></body>
</html>
好的,既然你已经确认了:
“cc”不能用作托管 bean 名称,因为与内置对象“cc”(复合组件)有冲突。
“JavaServer Faces 中的单词 cc 是复合组件的保留字。” https://javaee.github.io/tutorial/jsf-facelets005.html