尝试从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;
:使用数据库表验证用户登录信息(用户名和密码)的beanLogin
:执行某些业务服务的另一个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
。“调试”的概念对您来说似乎是全新的。我建议你多了解一些。调试