Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试从JSF中的另一个Bean获取值时出现NullPointerException错误_Jsf_Nullpointerexception - Fatal编程技术网

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

尝试从JSF中的另一个Bean获取值时出现NullPointerException错误,jsf,nullpointerexception,Jsf,Nullpointerexception,我有两个后盾: Login:使用数据库表验证用户登录信息(用户名和密码)的bean 总线服务:执行某些业务服务的另一个bean 我需要从登录bean中获取用户ID,并在总线服务中使用它。它存储在Login的字符串属性中,Buss\u服务需要此值来跟踪当前登录的用户并更新数据库 下面是登录支持bean: @ManagedBean(name="Login") @SessionScoped public class Login { private String loggedUserID;

我有两个后盾:

  • Login
    :使用数据库表验证用户登录信息(用户名和密码)的bean
  • 总线服务
    :执行某些业务服务的另一个bean
我需要从
登录
bean中获取用户ID,并在
总线服务
中使用它。它存储在
Login
的字符串属性中,
Buss\u服务
需要此值来跟踪当前登录的用户并更新数据库

下面是
登录
支持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);
    }

}
下面是调用
getLoggedID()
方法的
Buss\u服务
支持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.
}
这是我尝试访问Business services页面时得到的堆栈跟踪:

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
这是如何造成的,我如何解决


更新: 根据这里的评论和对类似问题的个人搜索,这个问题终于解决了,感谢上帝。 解决办法是我必须:

  • 将登录名的
    添加到adfc-config.xml文件中
  • 更重要的是,在
    @PostConstruct
    指定的方法init()中获取
    loggedUserID
    。谢谢大家

  • Ok NullPointerException是一类非常普遍的错误,它与jsf或db访问层等无关。从stacktrace中我可以看到,它是从最新的动作函数内部抛出的,您没有提供任何代码。转到该函数中的特定行,即172,查看您是否正在执行以下操作

     myObject.doSomething()
    
    if (myObject!=null)
        myObject.doSomething()
    
    在不检查对象是否为null的情况下,如果myObject为null,它可能会抛出NPE,因此执行类似的操作

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

    打印id时,请检查您的ManagedProperty
    登录名是否不为空

    然后尝试
    @ManagedProperty(value=“#{Login}”)

    该行上的
    NullPointerException
    login
    null
    的唯一可能原因。鉴于
    @ManagedProperty
    看起来不错,这可能只有一个原因:setter方法
    setLogin()
    被破坏。请确保其外观与此完全相同:

    public void setLogin(Login login) {
        this.login = login;
    }
    
    因此不是

    public void setLogin(Login login) {
        login = login;
    }
    
    或者别的什么


    根据评论更新

    至于faces-config.xml,这里是登录和业务服务bean,对于它们各自的jsf页面,在
    中被定义为“backingBean”。正如您所看到的,在JavaBean中,我定义了sessionScoped

    最后,还有你问题的原因。
    faces config.xml中的配置覆盖了相关bean上的所有JSF2注释。您显然没有在
    faces config.xml
    中配置
    。您有两种选择:

  • faces config.xml
    中删除整个
    配置。新的JSF 2.x注释(如
    @ManagedBean
    @ManagedProperty
    )的全部要点是摆脱冗长的JSF 1.x样式的XML配置

  • {Login}
    添加到
    总线服务的

    <managed-property>
        <property-name>login</property-name>
        <value>#{Login}</value>
    </managed-property>
    
  • 您的登录验证方法效率低下。它似乎将整个users表从DB拖到Java内存中,您可以在其中测试每一行。您应该尽可能多地编写和优化SQL查询,以便它能够准确地返回您要查找的信息

    statement = connection.prepareStatement("SELECT id FROM Users WHERE username = ? AND password = MD5(?)");
    statement.setString(1, username);
    statement.setString(2, password);
    resultSet = statement.executeQuery();
    
    if (resultSet.next()) {
        userID = resultSet.getLong("id");
    }
    
  • 您的类似PHP的代码风格完全与。这使得所有其他Java开发人员都更难阅读和维护代码,比如在Internet上发布代码时希望得到答案的开发人员,如下图所示。包名称应全部为小写。下划线仅在常量中有效,对于所有其他名称,应使用大小写。实例名称(如托管bean名称)应以小写字母开头。等等


  • 与其使用
    HtmlInputText
    ,不如直接使用
    String
    。我试过了,不幸的是,同样的问题……这是第(172)行:System.out.println(“登录用户(ID):”+login.get_final_Logged_ID());.get\u final\u logged\u ID()应返回logged\u user\u ID的值。。。为了进一步澄清,当有效的用户名/密码组合被接受时,在相同的代码块中,记录的用户ID(HTML inputtext)被设置为一个值。再次检查登录计算器,希望它能清除更多。@user1092784好的,我想我们可以把它归结为登录为空,可能有很多原因。。。显而易见的一点是,您没有托管属性的setLogin()方法。尝试添加公共void setLogin(Login Login){this.Login=Login;}@ChinPing我已经添加了get和setLogin方法,仍然是相同的错误!!我不明白为什么它会变成空的?因为它是sessionScoped,这意味着当另一个jsf页面支持bean想要从中获取属性值时,它应该是ok的,对吗??另外,登录页面之后将访问(业务服务)页面。请参见编辑,我认为bean是空的,而不是
    get\u final\u logged\u ID()
    我仔细检查了登录bean对象的setter和getter方法是否存在任何问题,它们看起来很好,但直到得到相同的erorr。非常感谢你给我的其他建议,先生。当然,这是完整的stacktrace?真正的根本原因是最底层的部分。JSF应该调用
    setLogin()
    方法,因为您有一个
    @ManagedProperty
    。您需要检查是否调用了该方法。在其上放置调试breanpoint或添加
    System.out.println()
    /
    logger.debug()
    行。感兴趣的变量,
    login
    。“调试”的概念对您来说似乎是全新的。我建议你多了解一些。调试