jsf目标无法访问,标识符[bean]解析为null

时间:2018-12-10 00:56:35

标签: jsf el propertynotfoundexception

浏览了以下链接后,我无法解决问题:Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable

我遇到以下错误:javax.servlet.ServletException:/Project9.xhtml @ 13,55 value =“#{ProjectBean.income}”:无法到达目标,标识符[ProjectBean]解析为空

我的表单:

<!DOCTYPE html>
 <html xmlns="http://wwww3.org/1999/xhtml"
  xmlns:a="http://xmlns.jcp.org/jsf/facelets"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  >
<h:head>
<title>Project9</title>
</h:head>

<h:body>
<h:form>
    Income: <h:inputText value="#{ProjectBean.income}"/>
    Number of people: <h:inputText value="#{ProjectBean.numPeople}"/>
        <h:commandButton value= "Submit" action= "Project9response"/>
</h:form>

</h:body>
</html>

我不确定正确的约定是wwww3.org还是www.3.org,但是我都尝试过。

我的回复页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  >
<h:head>
<title><ui:insert name="title">Project 9 response</ui:insert></title>
</h:head>


<h:body>
Am I above the poverty level: #{ProjectBean.abovePovertyLevel()}

</h:body>

</html>

我的豆子:

@ManagedBean
@SessionScoped
public class ProjectBean implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;
private double income;
private double numPeople;

//constructor is no arg
public ProjectBean() {

}

public double getIncome() {
    return income;
}
public void setIncome(double income) {
    this.income = income;
}
public double getNumPeople() {
    return numPeople;
}
public void setNumPeople(double numPeople) {
    this.numPeople = numPeople;
}

public boolean abovePovertyLevel() {
    if ( income < (16460.00 + 4320.00) * (numPeople - 2)){
        return false;
    }
    else {
    return true;
}
}

}

我的faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"
version="2.3">

</faces-config>

我在WEB-INF的lib文件夹中有我的faces-config.xml和javax-faces.2.2.8.jar文件 我的bean位于Java资源的src文件夹中

我还有一个名为helloworld的项目,其中有几个都能正常工作的JSF小项目,并且我尝试将project9复制到helloworld并运行它,但仅在该项目上会遇到相同的错误

我尝试按照人们的建议清理项目

这是一个学生项目,也是我对JSF和Tomcat的首次介绍。我正在使用Mac和Eclipse光子。

正如我在代码中的注释中所述,如果我尝试绕过响应xhtml文件并直接转到html表单中的javabean方法,则会在ProjectBean.abovePovertyLevel()下出现下划线,并且出现错误“操作值与导航案例结果不匹配”

我不确定上面链接中有关CDI等的某些答案,这些答案目前都在我的头上。

2 个答案:

答案 0 :(得分:3)

将所有#{ProjectBean.替换为#{projectBean.(使第一个字符小写)。

这是因为您需要通过名称而不是通过类名来引用托管bean。默认情况下,根据https://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedBean.html中的文档,jsf将为您生成该名称:

  

如果name属性的值未指定或为空String,则受管Bean名称是通过获取完全限定类名称的未限定类名称部分并将第一个字符转换为小写字母而派生的。例如,如果ManagedBean批注位于具有完全限定的类名com.example.Bean的类上,并且批注中没有name属性,则将managed-bean-name视为bean。

答案 1 :(得分:2)

没关系,我刚刚解决了这个问题 在我的注释中添加一个名称,例如:@ManagedBean(name =“ ProjectBean”)

我也意识到,如果我不先声明贫困水平,我的方法就是错误的

int povertyLevel = (16460 + 4230 * (numPeople-2));
    if(income > povertyLevel)
        return true;
    else{
    return false;
    }

这似乎可行