2013-05-28 48 views
2

我設計與管理豆JSF應用程序。 就目前而言,我只是一直在試圖創建一個簡單的登錄頁面(用戶名和密碼是硬編碼的時刻):JSF和ManagedBean:NullPointerException異常

<h:form class="form-signin"> 
    <h2 class="form-signin-heading">Please sign in</h2><hr /> 
    <input name="username" type="text" class="input-block-level" placeholder="Username" /> 
    <input name="password" type="password" class="input-block-level" placeholder="Password" /> 
    <h:commandButton action="#{userController.login}" class="btn btn-block btn-primary" type="submit" value="Sign in" /> 
</h:form> 

這裏是控制器(UserController.java):

@ManagedBean(name="userController") 
@ApplicationScoped 
public class UserController { 

    @EJB 
    private UserService userService; 

    public UserService getUserService() { 
     return userService; 
    } 

    public void setUserService(UserService userService) { 
     this.userService = userService; 
    } 

    public UserController() { 
    } 

    public void login() throws IOException { 
     Boolean login = userService.login("admin", "p4ssw0rd"); 
     ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
     if (login == true) { 
      externalContext.redirect("dashboard.xhtml"); 
     } else { 
      externalContext.redirect("login.xhtml"); 
     } 
    } 
} 

這是UserService.java文件:

@Stateless 
public class UserService { 

    @PersistenceContext 
    private EntityManager em; 

    public static String md5(String input) { 
     // Removed for clarity... 
    } 

    public Boolean login(String username, String password) { 
     //String hash = md5(password); 
     return Boolean.TRUE; // As you can see, nothing can fail for the moment 
    } 

} 

當我提交登錄表單,一個NullPointerException顯示出來:

javax.faces.el.EvaluationException: java.lang.NullPointerException 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    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:409) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.NullPointerException 
    at com.myname.myproject.managedbean.UserController.login(UserController.java:33) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 
    ... 24 more 

在UserController.java,如果我替換此行:

Boolean login = userService.login("admin", "p4ssw0rd"); 

通過這一個:

Boolean login = true; // Or false (I've tested twice) 

一切工作正常,因此它似乎像Java未能找到UserService。 ..

感謝您的幫助,我完全失去了。

+0

哪一個是你的UserController類中的第33行?從你的堆棧跟蹤中得到:java.lang.NullPointerException at com.myname.myproject.managedbean.UserController.login (UserController.java:33)'。 –

+0

順便說一句,你是在Tomcat上還是在Java EE應用服務器上運行這個服務,例如GlassFish 3,JBoss 7,TomEE ... –

+0

我正在運行在Tomcat服務器上,第33行是'public void login()拋出IOException {'。我需要在faces-config.xml中引用我的bean嗎? – mimipc

回答

0

你檢查把你的託管bean getter和setter方法叫做UserController的?

如果你沒有,即使代碼正確編譯,依賴注入將不能正確地舉行。

+0

用戶服務的獲取者和設置者? – mimipc

+0

是的。看來userService實例沒有getter/setter - 如果你沒有故意刪除它。 – talhaocakci

+0

我更新了我的代碼,但NullPointerException仍然存在... – mimipc

0

我認爲這個問題是EJB。如果它不是接口bean,則應該註釋@LocalBean,否則應該實現一個接口。嘗試是這樣的:

@Stateless 
public class UserService implements UserServiceLocal { 

    @Override 
    public boolean login() { 
     //dummy implementation 
     return true; 
    } 
} 

其中UserServiceLocal是:

@Local 
public interface UserServiceLocal { 

    public boolean login(); 
} 

用法:

@ManagedBean(name="userController") 
@ApplicationScoped 
public class UserController { 

    @EJB 
    private UserServiceLocal userService; 

    public void login() { 
     userService.login(); 
    } 
} 
+0

感謝您的回答。我是Java noob,那麼你能告訴我爲什麼它應該實現一個接口(它看起來很冗長),EJB和本地bean有什麼區別? – mimipc

0

關於你爲什麼應該實現一個接口問題,請參閱EJB's - when to use Remote and/or local interfaces?。一個EJB(企業Java Bean)的可以有一個接口(可與@Remote進行註釋,這意味着誰實現它運行在分佈式環境中,或與豆腐同一個JVM內部運行@Local註釋的意義,相反豆,一個沒有接口的bean是一個沒有實現任何接口的bean,因此,你應該指示JVM把它當作一個bean而不是POJO(普通的舊Java對象);這可以通過在類中添加@LocalBean註解來實現它應該是你的bean/EJB。