2013-09-21 44 views
2

我是JSF及其關聯人員的新手。javax.el.PropertyNotFoundException:/index.xhtml @ 19,67 value =「#{credentials.username}」:目標無法訪問,標識符'憑據'已解析爲空

我的開發如下 的Java 6 的Tomcat 6 的Eclipse Primeface 2.5

我試圖在即時primefaces起動機描述的測試Web應用程序環境。

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0"> 

<display-name>PrimeFaces Web Application</display-name> 

<!-- Change to "Production" when you are ready to deploy --> 
<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 

<!-- Welcome page --> 
<welcome-file-list> 
    <welcome-file>faces/index.xhtml</welcome-file> 
</welcome-file-list> 

<!-- JSF mapping --> 
<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<!-- Map these files with JSF --> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.faces</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 

faces-config.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd" 
      version="2.1"> 

的beans.xml

是一個空文件

的index.xhtml

<!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://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:p="http://primefaces.org/ui"> 
<h:head /> 
<body> 
<ui:composition template="/WEB-INF/templates/main.xhtml"> 
    <ui:define name="title">Welcome to our site</ui:define> 
    <ui:define name="content"> 
     <h:form> 
      <h:panelGrid columns="2" border="0"> 
       <p:panel header="Please Sign In"> 
        <p:panelGrid columns="2" styleClass="no-border" 
         columnClasses="no-border,no-border"> 
         <p:outputLabel value="Username" for="username" /> 
         <p:inputText id="username" label="Username" 
          value="#{credentials.username}" /> 
         <p:outputLabel value="Password" for="password" /> 
         <p:password id="password" label="Password" 
          value="#{credentials.password}" /> 
         <h:outputText value="" /> 
         <p:commandLink value="Forgot your password?" /> 
         <h:outputText value="" /> 
         <p:commandButton value="Login" action="members" 
          actionListener="#{loginController.login}" /> 
         <h:outputText value="" /> 
        </p:panelGrid> 
       </p:panel> 
       <ul> 
        <li>Find out what's happening</li> 
        <li>Rate and review shows</li> 
        <li>Invite your friends</li> 
        <li><a href="/faces/register.xhtml">Join today!</a> 
        </li> 
       </ul> 
      </h:panelGrid> 
     </h:form> 
    </ui:define> 
</ui:composition> 
</body> 
</html> 

loginController.java

package com.example.starterexample.controller; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.RequestScoped; 
import javax.faces.bean.ViewScoped; 

import com.example.starterexample.model.Credentials; 

/** 
* Controller class for desktop and mobile login functionality. 
* 
* @uml.dependency supplier="com.mycompany.controller.AbstractController" 
*/ 
@ManagedBean(name="loginController", eager=true) 
//@ViewScoped 
@RequestScoped 
/* 
* @ViewScoped means the object is created by JSF 
*    and its lifecycle is scoped to the current view. 
*   Once the user navigates to another view, the LoginControllerobject  is released and 
*   will eventually be garbage-collected by the JVM 
*/ 
public class LoginController extends AbstractController { 

private static final long serialVersionUID = -6710063228036238737L; 

@ManagedProperty(value = "#{credentials}") 
private Credentials credentials; 

public String login() { 
    String outcome = null; 
    try { 
     String username = credentials.getUsername(); 
     String password = credentials.getPassword(); 
     //User user = userService.findUser(username, password); 
     //if (user == null) { 
     // addErrorMessage("Invalid login"); 
     // userSession.setUser(null); 
     //} else { 
     // userSession.setUser(user); 
     // if (!activeUsers.contains(user)) { 
     //  activeUsers.add(user); 
     // } 
      //outcome = "members"; 
     //} 

      addErrorMessage("Invalid login"); 
    } catch (Exception e) { 
     logger.error("Unable to login:", e); 
    } 
    return outcome; 
} 

public void setCredentials(Credentials credentials) { 
    this.credentials = credentials; 
} 


} 

Credentials.java

package com.example.starterexample.model; 

import javax.enterprise.inject.Model; 

@Model 
public class Credentials { 

private String username; 
private String password; 

public String getUsername() { 
    return username; 
} 
public void setUsername(String username) { 
    this.username = username; 
} 
public String getPassword() { 
    return password; 
} 
public void setPassword(String password) { 
    this.password = password; 
} 


} 

錯誤:

Sep 21, 2013 5:03:34 PM com.sun.faces.lifecycle.ProcessValidationsPhase execute 
WARNING: /index.xhtml @19,67 value="#{credentials.username}": Target Unreachable, identifier 'credentials' resolved to null 
javax.el.PropertyNotFoundException: /index.xhtml @19,67 value="#{credentials.username}": Target Unreachable, identifier 'credentials' resolved to null 
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100) 
at    org.primefaces.renderkit.InputRenderer.findImplicitConverter(InputRenderer.java:170) 
at org.primefaces.renderkit.InputRenderer.findConverter(InputRenderer.java:190) 
at org.primefaces.renderkit.InputRenderer.getConvertedValue(InputRenderer.java:196) 
at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030) 
at javax.faces.component.UIInput.validate(UIInput.java:960) 
at javax.faces.component.UIInput.executeValidate(UIInput.java:1233) 
at javax.faces.component.UIInput.processValidators(UIInput.java:698) 
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) 
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) 
at org.primefaces.component.panel.Panel.processValidators(Panel.java:297) 
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) 
at javax.faces.component.UIForm.processValidators(UIForm.java:253) 
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) 
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172) 
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Thread.java:662) 

請幫我找到我缺少的東西。

我已經找了類似的問題,沒有爲我工作。

我已經檢查了創建WAR文件和類文件的WEB-INF/classes中

感謝提前發現。

回答

0

只有ManagedBeans可以在faces上下文中訪問。因此,您將不得不通過loginController訪問credentials,例如, #{loginController.credentials.username}。您還需要將一個getCredentials()方法添加到LoginController。

+0

您可能還需要一個getCredentials(顯示)甲基od在LoginController中。 – morja

+0

正如你所建議的,我嘗試修改表達式,並得到以下錯誤。 2013年9月21日7:16:17 com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException SEVERE:錯誤呈現視圖[/index.xhtml] javax.el.PropertyNotFoundException:/index.xhtml @ 19, 83 value =「#{loginController.credentials.username}」:EL實現中缺少資源:??? propertyNotReadable ??? \t at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111) .... – Sasi

+0

是的,請參閱我以前的評論和編輯答案。您需要獲取憑證的獲取者。 – morja

1

您不允許執行您嘗試的操作:使用JSF註釋訪問CDI bean。 javax.enterprise.inject.model是CDI基於註解左右,這取決於你的JSF的版本,你有以下幾種選擇:

  1. 使用@Named轉換loginController到CDI bean,然後用@Inject來獲取模型的保持 - JSF 2.1

  2. 升級到JSF 2.2,讓您使用@Inject@ManagedProperty與CDI豆

+0

嗨,對於最近的回覆抱歉,請給我一個樣本工作,或者你能看看我的項目代碼和幫助,請將您的電子郵件ID發送給我郵寄此項目。 – Sasi

2

我也用這個例子自我學習等。其實我和你面臨同樣的問題。此示例有錯誤,因此您不應該盲目使用它。這article幫助我更好地理解bean類型(CDI,EJB,JSF bean)和編寫可用代碼。

您不應該在CDI中使用JSF託管bean。 CDI豆本身更強大。 這對我有用。

的LoginController開始像

import javax.faces.context.ExternalContext; 
import javax.faces.context.FacesContext; 
import javax.inject.Inject; 
import javax.inject.Named; 


@Named 
@javax.faces.view.ViewScoped 
public class LoginController extends AbstractController { 


    private static final long serialVersionUID = -6710063228036238737L; 


     @Inject 
    private ActiveUsers activeUsers; 

     @Inject 
    private Credentials credentials; 

     @Inject 
    private UserService userService; 

.... 
} 

ActiveUsers看起來像

import java.util.ArrayList; 
import javax.enterprise.context.ApplicationScoped; 
import javax.inject.Named; 

@Named("activeUsers") 
@ApplicationScoped 
public class ActiveUsers extends ArrayList<User> { 

    private static final long serialVersionUID = -3068333669859836249L; 

} 

憑據:

import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 

@Named("credentials") 
@RequestScoped 
public class Credentials { 

    private String password; 

    private String username; 

    public String getPassword() { 
     return password; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

} 

希望這將幫助你

+0

感謝您的文章鏈接。這很有幫助。 – armandino

相關問題