在 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