2012-01-04 46 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