我有两个支持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
这是如何引起的?如何解决?
更新: 根据这里的评论以及与此处所述的类似问题的个人搜索,问题终于得到了解决,感谢上帝。 解决方案是我必须:
<managed-property>
添加到adfc-config.xml文件中。 loggedUserID
anotated方法init()中获取@PostConstruct
。 Thanx everyone。答案 0 :(得分:2)
System.out.println("Logged User (ID): " + login.get_final_logged_ID());
该行上的NullPointerException
是导致login
为null
的唯一可能原因。鉴于@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
。您有两个选择:
删除<managed-bean>
中的整个faces-config.xml
配置。新的JSF 2.x注释(如@ManagedBean
,@ManagedProperty
等)的重点是摆脱详细的JSF 1.x样式XML配置。
将<managed-property>
值#{Login}
添加到<managed-bean>
的{{1}}。
Buss_Services
无关。你在设计和代码风格上有几个严重的缺陷。
您应不引用<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}")
!