NullPointerException尝试从JSF中的另一个Bean获取值时出错

时间:2011-12-11 23:33:54

标签: jsf nullpointerexception

我有两个支持bean:

  • Login:一个用数据库表验证用户登录信息(用户名和密码)的bean。
  • Buss_Services:另一个执行某些业务服务的bean。

我需要从Login bean获取用户ID并在Buss_Services内使用它。它存储在Login的String属性中,Buss_Services需要此值来跟踪当前登录的用户并更新数据库。

这是Login支持bean:

@ManagedBean(name="Login")
@SessionScoped
public class Login {
    private String loggedUserID;

    public Object logCB_action() {
        try {
            // ...
            rs = stmt.executeQuery(SQL);
            while (rs.next()) {
                if (rs.getString("USER_NAME").equals(uname)) {
                    if (rs.getString("USER_PW").equals(pword)) {

                     // Here, the user ID is set.
                    loggedUserID=rs.getString("USER_ID");// This line ...


                    System.out.println("Logged User (ID): "+ userID);

                        return ("displayApp");
                    }
                }
            }
        }

        // ...
    }        

    public String getLoggedID() {
        // Here, the user ID is returned.
        String id = loggedUserID;
        return (id);
    }

}

这是调用Buss_Services方法的getLoggedID()支持bean:

@ManagedBean(name="Buss_Services")
@SessionScoped
public class Buss_Services {



    @ManagedProperty("#{Login}")
    private Login login;

    public void newEst_action() {
        // The following line throws NullPointerException.
        System.out.println("Logged User (ID): " + login.getLoggedID());       
    }

    // Getters/setters.
}

这是我尝试访问商务服务页面时获得的堆栈跟踪:

javax.faces.el.EvaluationException:
//C:/Users/Sultan09/AppData/Roaming/JDeveloper/system11.1.2.0.38.60.17/o.j2ee/drs/TheOCES/OCES.ViewControllerWebApp.war/App_Business_SerivesPG.jsf @68,140 action="#{backingBeanScope.App_BServPG_Bean.newEst_action}": java.lang.NullPointerException

at org.apache.myfaces.trinidad.component.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:51)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at org.apache.myfaces.trinidad.component.UIXCommand.broadcast(UIXCommand.java:190)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._invokeApplication(LifecycleImpl.java:965)
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._executePhase(LifecycleImpl.java:346)
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:204)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:173)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.adfinternal.view.faces.webapp.rich.RegistrationFilter.doFilter(RegistrationFilter.java:121)
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:468)
at oracle.adfinternal.view.faces.activedata.AdsFilter.doFilter(AdsFilter.java:60)
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:468)
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:293)
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:199)
at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:111)
at java.security.AccessController.doPrivileged(Native Method)
at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:313)
at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:413)
at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:94)
at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:161)
at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:71)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:136)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:178

 Caused by: java.lang.NullPointerException
    at JavaView.backing.Buss_Services.newEst_action(Buss_Services.java:172)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.el.parser.AstValue.invoke(Unknown Source)
    at com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at org.apache.myfaces.trinidad.component.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:46)
    ... 44 more

这是如何引起的?如何解决?


更新: 根据这里的评论以及与此处所述的类似问题的个人搜索,问题终于得到了解决,感谢上帝。 解决方案是我必须:

  1. 将登录的<managed-property>添加到a​​dfc-config.xml文件中。
  2. 更重要的是,在loggedUserID anotated方法init()中获取@PostConstruct。 Thanx everyone。

3 个答案:

答案 0 :(得分:2)

System.out.println("Logged User (ID): " + login.get_final_logged_ID());       

该行上的NullPointerException是导致loginnull的唯一可能原因。鉴于@ManagedProperty看起来很好,这只有一个可能的原因:setter方法setLogin()被破坏了。确保它看起来完全像这样:

public void setLogin(Login login) {
    this.login = login;
}

因而

public void setLogin(Login login) {
    login = login;
}

或其他。


根据评论

更新

  

至于faces-config.xml,这就是它们的jsf页面的Login和bussiness服务bean,在<managed-bean-scope>中被定义为“backingBean”。在java bean中,正如你所看到的,我将它们定义为sessionScoped。

最后,有问题的原因。 faces-config.xml 中的配置会覆盖所讨论的bean上的所有JSF2注释。您显然没有在<managed-property>中配置faces-config.xml。您有两个选择:

  1. 删除<managed-bean>中的整个faces-config.xml配置。新的JSF 2.x注释(如@ManagedBean@ManagedProperty等)的重点是摆脱详细的JSF 1.x样式XML配置。

    < / LI>
  2. <managed-property>#{Login}添加到<managed-bean>的{​​{1}}。

    Buss_Services

  3. 对具体问题

    无关。你在设计和代码风格上有几个严重的缺陷。

    • 您应引用<managed-property> <property-name>login</property-name> <value>#{Login}</value> </managed-property> 作为属性。相反,您应该引用它的值。保持模型尽可能简单,除非您有正确的理由,否则永远不要使用UIComponent。 E.g。

      UIComponent
    • 您的登录验证方法效率低下。它似乎将整个用户表从DB转移到Java的内存中,其中您测试每一行。您应该尝试尽可能多地编写和微调SQL查询,以便它返回完全您正在寻找的信息。

      private String username;
      private String password;
      private Long userID;
      
    • 您的类似PHP的代码风格与Java Naming Conventions完全矛盾。它使得所有其他Java开发人员更难以阅读和维护代码,例如,当您在Internet上发布代码时,您希望得到答案的人,就像这里一样。包名称应全部小写。下划线仅在常量中有效,因为应使用CamelCase的所有其他名称。实例名称(如托管bean名称)应以小写开头。等等。

答案 1 :(得分:0)

Ok NullPointerException是一类很常见的错误,它与jsf或你的数据库访问层等无关。至于我从堆栈跟踪中可以看到它是从newEst_action函数内部抛出的,你没有提供任何代码。转到该函数中的特定行,即172并查看您是否正在执行类似

的操作
 myObject.doSomething()

没有检查对象是否为null,如果myObject为null,它可能抛出NPE,所以做类似的事情

if (myObject!=null)
    myObject.doSomething()

答案 2 :(得分:0)

打印身份证时,请检查您的托管资产login是否为空。

并尝试@ManagedProperty(value = "#{Login}")