【问题标题】:JSF and ManagedBean : NullPointerException [duplicate]JSF 和 ManagedBean:NullPointerException [重复]
【发布时间】:2013-05-28 12:57:45
【问题描述】:

我正在设计一个带有托管 bean 的 JSF 应用程序。 目前,我只是在尝试创建一个简单的登录页面(用户名和密码暂时是硬编码的):

<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...

感谢您的帮助,我完全迷路了。

【问题讨论】:

  • UserController 类中的第 33 行是哪一行?取自您的堆栈跟踪:java.lang.NullPointerException at com.myname.myproject.managedbean.UserController.login(UserController.java:33).
  • 顺便说一下,您是在 Tomcat 上运行它还是在 Java EE 应用程序服务器上运行它,例如GlassFish 3、JBoss 7、TomEE...
  • 我在 Tomcat 服务器上运行它,第 33 行是 public void login() throws IOException {。我需要在 faces-config.xml 中引用我的 bean 吗?

标签: java jsf nullpointerexception managed-bean


【解决方案1】:

您是否检查过将 getter 和 setter 放入名为 UserController 的托管 bean 中?

如果你不这样做,即使代码编译正确,依赖注入也不会被正确持有。

【讨论】:

  • userService 的获取器和设置器?
  • 是的。似乎 userService 实例没有 getter/setter - 如果您没有故意删除它。
  • 我更新了我的代码,但 NullPointerException 仍然存在...
  • 标记为@EJB 的属性不需要getter 或setter。
【解决方案2】:

我相信问题出在 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();
    }
}

【讨论】:

  • 感谢您的回答。我是一个 Java 菜鸟,所以你能告诉我为什么它应该实现一个接口(看起来很冗长)以及 EJB 和本地 bean 之间有什么区别?
【解决方案3】:

关于为什么它应该实现接口的问题,请参阅EJB's - when to use Remote and/or local interfaces?。一个EJB(企业java bean)可以有一个接口(可以用@Remote注解,表示实现它的bean运行在分布式环境中,或者用@Local注解表示bean运行在同一个JVM中。相反,无接口 bean 是不实现任何接口的 bean。因此,您应该指示 JVM 将其视为 bean 而不是 POJO(plain old java object);这可以通过在类上添加 @LocalBean 注释来完成它应该是你的 bean /EJB。

【讨论】:

    猜你喜欢
    • 2014-07-14
    • 2014-05-21
    • 2017-04-24
    • 2017-07-17
    • 1970-01-01
    • 2012-07-21
    • 2014-06-28
    • 2015-07-28
    • 2011-01-08
    相关资源
    最近更新 更多