2012-06-13 5 views
2

Я хочу иметь окно списка в JSF. Я написал простой код, но он не работает. На демо-странице я вижу пустое поле со списком, а на странице пользователя - ошибка.javax.el.PropertyNotFoundException: /demo.xhtml @ 24,55 value = "# {UserBean.favYear3}": Target Unreachable, идентификатор UserBean разрешен к null

UserBean.java

@ManagedBean 
@SessionScoped 
public class UserBean implements Serializable{ 
    public String favYear3;//list box 

    public String getFavYear3() { 
     return favYear3; 
    } 

    public void setFavYear3(String favYear3) { 
     this.favYear3 = favYear3; 
    } 
    public static class Year{ 
     public String yearLabel; 
     public String yearValue; 

     public Year(String yearLabel, String yearValue){ 
      this.yearLabel = yearLabel; 
      this.yearValue = yearValue; 
     } 

     public String getYearLabel(){ 
      return yearLabel; 
     } 

     public String getYearValue(){ 
      return yearValue; 
     } 

    } 

    public Year[] year3List; 

    public Year[] getFavYear3Value() { 

     year3List = new Year[3]; 
     year3List[0] = new Year("Year3 - 2000", "2000"); 
     year3List[1] = new Year("Year3 - 2010", "2010"); 
     year3List[2] = new Year("Year3 - 2020", "2020"); 

     return year3List; 
    } 

} 

demo.xhtml

<?xml version="1.0" encoding="UTF-8" ?> 
<!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:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>first jsf page</title> 
</head> 
<h:body> 
    <h1>JSF 2 check example</h1> 

    <h:form> 
     <h:selectOneListbox value="#{UserBean.favYear3}"> 
      <f:selectItems value="#{UserBean.favYear3Value}" var="y" 
       itemLabel="#{y.yearLabel}" itemValue="#{y.yearValue}" /> 
     </h:selectOneListbox> 
    </h:form> 

</h:body> 
</html> 

user.xhtml

<?xml version="1.0" encoding="utf-8" ?> 
<!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:h="http://java.sun.com/jsf/html"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>second jsf page</title> 
</head> 
<h:body> 
    <h:outputText value="#{UserBean.favYear3}"/> 
</h:body> 
</html> 

Моей проблема: в демо-странице у меня есть пустое поле. в пользовательской странице ошибка:

type Exception report 

message 

description The server encountered an internal error() that prevented it from fulfilling this request. 

exception 

javax.servlet.ServletException: javax.el.PropertyNotFoundException: /demo.xhtml @24,55 value="#{UserBean.favYear3}": Target Unreachable, identifier 'UserBean' resolved to null 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:321) 


root cause 

javax.faces.component.UpdateModelException: javax.el.PropertyNotFoundException: /demo.xhtml @24,55 value="#{UserBean.favYear3}": Target Unreachable, identifier 'UserBean' resolved to null 
    javax.faces.component.UIInput.updateModel(UIInput.java:848) 
    javax.faces.component.UIInput.processUpdates(UIInput.java:730) 
    javax.faces.component.UIForm.processUpdates(UIForm.java:268) 
    javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1109) 
    javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1109) 
    javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1218) 
    com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:74) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) 

Что не так?

ответ

1

Вы должны сделать свой bean доступным/управляемым. Для этого вы можете либо

аннотировать его с CDI (@Named) или JSF (@ManagedBean) аннотацию:

@Named 
@SessionScoped 
public class UserBean implements Serializable{...} 

или описать его в faces-config.xml как managed-bean, как это:

<managed-bean> 
    <managed-bean-name>userBean</managed-bean-name> 
    <managed-bean-class>com.example.UserBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 
+0

, я сделал это раньше, я отредактировал сообщение. – samira

+0

Я добавляю ваш код в свой face-config. теперь у меня нет ошибки, но она не работает. мой список пуст, и я не могу выбрать – samira

+2

@Sami: если ответ сделал * не * решить вашу конкретную проблему, то вы не должны сразу же ее отмечать. Это только смущает других читателей. Отмечайте ответ только тогда, когда он действительно решил конкретную проблему. – BalusC

4

Ваше управляемое имя bean в EL ошибочно. Вы объявили боб следующим образом:

@ManagedBean 
@SessionScoped 
public class UserBean implements Serializable{ 

Если вы не указать атрибут @ManagedBeanname, то это будет соответствовать по JavaBeans наименования статей по умолчанию на имя класса с 1-го символом, как так нижним регистром userBean, но но вы пытаетесь ссылаться на них с точным именем класса #{UserBean}. Вы должны исправить это имя соответственно как #{userBean}.

faces-config.xml регистрация не требуется для JSF 2.x. Убери это.

Смежные вопросы