2012-01-04 111 views
0

我尝试打印登录的用户名是这样的:的facelet获取对象属性

<p>Welcome #{sessionScope.authUser.email}</p> 

用户模型中的get-ER和设置-ER的名称都存在。

这是抛出的错误:

javax.servlet.ServletException: For input string: "email" 

我在做什么错?

编辑堆栈跟踪:

SEVERE: Error Rendering View[/account.xhtml] 
javax.el.ELException: /account.xhtml: For input string: "email" 
    at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:90) 
    at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82) 
    at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.NumberFormatException: For input string: "email" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Integer.parseInt(Integer.java:449) 
    at java.lang.Integer.parseInt(Integer.java:499) 
    at javax.el.ListELResolver.toInteger(ListELResolver.java:407) 
    at javax.el.ListELResolver.getValue(ListELResolver.java:199) 
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:116) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:163) 
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219) 
    at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:224) 
    at com.sun.faces.facelets.el.ELText$ELTextComposite.writeText(ELText.java:148) 
    at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:85) 
    ... 35 more 

INFO: Exit : render_response 6 
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception 
java.lang.NumberFormatException: For input string: "email" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Integer.parseInt(Integer.java:449) 
    at java.lang.Integer.parseInt(Integer.java:499) 
    at javax.el.ListELResolver.toInteger(ListELResolver.java:407) 
    at javax.el.ListELResolver.getValue(ListELResolver.java:199) 
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:116) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:163) 
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219) 
    at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:224) 
    at com.sun.faces.facelets.el.ELText$ELTextComposite.writeText(ELText.java:148) 
    at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:85) 
    at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82) 
    at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:662) 
+1

请显示* full * stack trace和* real *代码。答案是堆栈跟踪的最根本原因。到目前为止发布的代码似乎并没有以任何方式与错误消息相关。或者,当你删除特定的代码行时,异常真的消失了吗? – BalusC 2012-01-04 20:26:07

+0

这没有道理。你在说你试图打印'name',并且发布的stacktrace消息正在讨论作为输入的''email''。你需要更新你的帖子。 – 2012-01-04 20:29:52

+0

更新了这个问题。奇怪的是,如果我只是调用#{sessionScope.authUser} – TGM 2012-01-04 20:30:09

回答

4
<p>Welcome #{sessionScope.authUser.name}</p> 

该行代码可能不可能引发此异常。

java.lang.NumberFormatException: For input string: "email" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Integer.parseInt(Integer.java:449) 
    at java.lang.Integer.parseInt(Integer.java:499) 
    at javax.el.ListELResolver.toInteger(ListELResolver.java:407) 
    at javax.el.ListELResolver.getValue(ListELResolver.java:199) 
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:116) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:163) 
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219) 
    ... 

看,有一个ListELResolver参与。这表明,你有什么地方像

#{bean.list.email} 

其中#{bean.list}的实际返回List,因此需要通过使用括号符号[]像如下得到第1项(整数索引来访问其在转当然应该有email属性):

#{bean.list[0].email} 

更新按照您的更新,真正的代码是

<p>Welcome #{sessionScope.authUser.email}</p> 

authUser显然实现List或延伸它的子类中的一个。这对于托管bean来说没有任何意义。从托管bean类声明中删除接口或子类。只需以下就足够了:

@ManagedBean 
@SessionScoped 
public class AuthUser implements Serializable { 
    // ... 
} 

而且,虽然明确规定等作为#{sessionScope.authUser}可能是自纪实的目的有帮助的范围,这是不必要的。只需使用#{authUser}


更新2按照注释:你似乎已经人工放置的对象实际上是一个List会话范围。这很腥。考虑使用一个正常的会话作用域管理bean,它在处理登录的请求作用域bean中作为托管属性注入。

+0

谢谢!问题在于托管bean。我在会话中放置了getResultList()而不是getSingleResult的结果。再次感谢! – TGM 2012-01-04 20:38:47

+0

哦,你已经手动在会话范围内放置了一个对象?为什么不把它作为会话作用域bean的属性? – BalusC 2012-01-04 20:42:06

+0

我试图做到这一点,但我找不到一个明确的教程,介绍了通过不同的bean注入这些属性时的一些良好实践,因此我选择了一些我知道它的工作原理。这不是一个好习惯吗? – TGM 2012-01-04 20:49:19

0

起初,你肯定这个bean在会话存在?如果是这样,请尝试使用#{sessionScope ['authUser']。name}。

+0

那行代码可能不可能用特定的消息抛出异常,并且你提出的改变在技术上不会改变任何东西。 – BalusC 2012-01-04 20:28:25

+0

顺便说一句如何在没有发布答案的情况下对问题添加评论? – 2012-01-04 20:31:14

+0

当你获得至少50个声望时,你获得此特权。在那之下,你只能评论你自己的帖子。 – BalusC 2012-01-04 20:31:42