Цель jsf недоступна, идентификатор [bean] разрешен до нуля

После просмотра ссылок, подобных следующим, я не могу решить проблему: Определение и решение 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;
}
}

}

Мои лица-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>

У меня есть мой файл face-config.xml и мой файл javax-face.2.2.8.jar в папке lib WEB-INF У меня есть бин в папке src Ресурсов Java

У меня есть другой проект под названием helloworld с несколькими небольшими проектами JSF, которые все работают, и я попытался скопировать project9 в helloworld и запустить его, но я получаю ту же ошибку только в этом проекте

Я пытался очистить свой проект, как люди предложили

Это студенческий проект и мое первое знакомство с JSF и Tomcat. Я использую фотон Mac и Eclipse.

Как я указывал в комментарии в своем коде, если я пытаюсь обойти файл xhtml ответа и сразу перейти к методу javabean в моей html-форме, я получаю подчеркивание в ProjectBean.abovePovertyLevel() и появляется ошибка "значение действия не соответствовать результату навигации "

Я не уверен в некоторых ответах по ссылке выше относительно CDI и т. Д., Что на данный момент все выше моего понимания.

2 ответа

Неважно, я просто решил это Добавил имя к моей аннотации как таковой: @ManagedBean(name="ProjectBean")

Также я понял, что мой метод был неправильным, если я сначала не объявил уровень бедности

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

Казалось, это работает

Заменить все #{ProjectBean. от #{projectBean. (сделать первый символ строчным).

Это потому, что вам нужно обращаться к управляемому бину по имени, а не по имени класса. По умолчанию jsf сгенерирует это имя для вас, согласно документам на https://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedBean.html:

Если значение атрибута name не указано или является пустой строкой, имя управляемого bean-компонента получается из взятия части неквалифицированного имени класса полного имени класса и преобразования первого символа в нижний регистр. Например, если аннотация ManagedBean находится в классе с полностью определенным именем класса com.example.Bean, и в аннотации отсутствует атрибут name, то имя управляемого bean-компонента принимается как bean-компонент.

Другие вопросы по тегам