目标无法访问,标识符' bean'解决了null错误

时间:2014-12-14 20:16:25

标签: jsf

我尝试使用Glassfish作为app服务器构建简单的JSF应用程序,并且它已经开始但是之后发生了这个错误:

javax.el.PropertyNotFoundException: /index.xhtml @10,75 value="#{bean.genre}": Target Unreachable, identifier 'bean' resolved to null
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)....

我尝试将我的Bean注释更改为@Model并尝试了不同类型的Scopes,但这并没有帮助。

这是我的index.xhtml页面:

<!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
    <h:form id="genreForm">
        <h:outputLabel for="genre" value="genre" />
        <h:inputText id="genre" value="#{bean.genre}" label="genre" />
        <br/><br/>
        <p:commandButton action="#{bean.addGenre}" update="genreList"
                         value="Add genre" icon="ui-icon-check" style="margin:0"/>
        <br/>
        <br/>
        <h:dataTable  id="genreList" value="#{bean.getGenreList()}" var="g" border="1">
            <h:column>
                <f:facet name="header">
                    Genre id
                </f:facet>
                #{g.genreId}
            </h:column>
            <h:column>
                <f:facet name="header">
                    Name
                </f:facet>
                #{g.genre}
            </h:column>
        </h:dataTable>
    </h:form>
</h:body>

这是我的Bean:

@ManagedBean(name = "Bean", eager = true)
@SessionScoped
public class Bean {

private int genreId;
private String genre;

public void addGenre() {
    GenreDAO dao = new GenreDAOImpl();
    Genre myGenre = new Genre();
    myGenre.setGenre(genre);
    dao.save(myGenre);
}

public String getGenre() {
    return genre;
}

public void setGenre(String genre) {
    this.genre = genre;
}

public int getGenreId() {
    return genreId;
}

public void setGenreId(int genreId) {
    this.genreId = genreId;
}

public List<Genre> getGenreList() {
    GenreDAO dao = new GenreDAOImpl();
    List<Genre> list = dao.findAll();
    return list;
}
}

2 个答案:

答案 0 :(得分:1)

默认情况下,如果未在@ManagedBean注释中提供托管bean名称,则用于访问bean的表达式语言表达式不应以首字母为小写字母开头。例如,如果您有以下托管bean声明

@ManagedBean
public class Bean {
    //some fields and methods
}

然后你应该以小写的第一个字母访问你的bean

<h:inputText value="#{bean.somePropertyName}">

但您可以通过@ManagedBean注释name属性自定义用于引用bean的名称。在这种情况下,用于引用bean的EL表达式应该拼写您的name属性中提供的bean名称完全,包括第一个信件。所以如果你的代码中有这个

@ManagedBean (name="Bean")
public class Bean

你的bean应该像这样访问

<h:inputText value="#{Bean.somePropertyName}">

答案 1 :(得分:0)

@ManagedBean(name = "Bean", eager = true)

在这里,您将bean的名称设置为“Bean”,但是您尝试在el中将其作为“bean”访问。改变他们中的任何一个,让它工作。