2011-08-16 11 views
1

私はjsf 2を使用していますが、私は説明したり理解しづらい動作をしています。JSF getterが呼び出されると期待していないときにJSF getterが呼び出される理由を把握します

私はいくつかの独立系を持っています。

1は次のようになります。

<h:form> 
    <h:commandButton value="#{text.General_Wipe_Now}" action="#{bean.doThate}" > 
     <f:ajax execute="@form" render="@form" /> 
    </h:commandButton> 
    <h:selectBooleanCheckbox value="#{bean.ignoreErrors}">Ignore Errors</h:selectBooleanCheckbox> 
</h:form> 

私の質問/問題は、私はaformentionedボタンを押すたびに、私は呼ばれている(他の形態の一部である)他の、無関係な、豆のメンバーゲッターを参照してくださいということです。 (ロギングを通じて)

ゲッターのいずれにもビジネスロジックはありませんが、の理由がわかります。 stacktraceの印刷では、確かにJSFがそれらを呼び出すものであることを確認しました。

私はJSFに従って、彼らがなぜ呼び出されているのか理解していますか? 理由は何でしょうか?

ありがとうございます! ベン。

UPDATEここ

が実行されているゲッターのいずれかで印刷され、想定されていないとスタックトレースです。 コメントで説明したように、この質問に関連するすべての詳細を含めることは非常に複雑になるため、私自身は答えを見つけるためのツールに助けを借りたいと考えています。私は1つを持っていたらSSCCEを作る上での作業

java.lang.Exception 
    at com.aCompanyName.applicationName.beans.aBean.getSomethingFromBean(CurrentDevice.java:382) 
    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 javax.el.BeanELResolver.getValue(BeanELResolver.java:302) 
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) 
    at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:142) 
    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 org.apache.myfaces.view.facelets.el.TagValueExpression.getValue(TagValueExpression.java:85) 
    at org.apache.myfaces.view.facelets.component.UIRepeat.getValue(UIRepeat.java:248) 
    at org.apache.myfaces.view.facelets.component.UIRepeat.getDataModel(UIRepeat.java:211) 
    at org.apache.myfaces.view.facelets.component.UIRepeat._validateAttributes(UIRepeat.java:530) 
    at org.apache.myfaces.view.facelets.component.UIRepeat.visitTree(UIRepeat.java:763) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:797) 
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:992) 
    at org.apache.myfaces.view.facelets.tag.ui.DebugPhaseListener._doTreeVisit(DebugPhaseListener.java:310) 
    at org.apache.myfaces.view.facelets.tag.ui.DebugPhaseListener.afterPhase(DebugPhaseListener.java:286) 
    at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersAfter(PhaseListenerManager.java:111) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:185) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.openejb.tomcat.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:662) 

UPDATE 2

、更新します。

UPDATE 3

問題は<ui:repeat> value属性で発生するようです。 これは、問題を例示SSCCEコードです:

<h:body> 
    <ui:repeat var="str" value="#{admin.SList}"> 
     STRING: #{str} 
    </ui:repeat> 

    <h:form> 
     <h:commandButton value="pressie" action="#{admin.doThat}"> 
      <f:ajax execute="@form"/> 
     </h:commandButton> 
    </h:form> 
</h:body> 

豆コード:ボタンを押すと

@PostConstruct 
public void init() 
{ 
    slist.add("Testing"); 
    slist.add("This"); 
    slist.add("Thing"); 
} 

private List<String> slist = new ArrayList<String>(); 

public List<String> getSList(){ 
    logger.trace("Getting LIST"); 
    return slist; 
} 

public void doThat(){ 
    logger.trace("DoThat Was Run"); 
} 

、これはログに出力されます。

2011-08-16 16:55:55,853 TRACE [http-80-2] (AdminBean.java:80) - Getting LIST 
2011-08-16 16:55:55,865 TRACE [http-80-2] (AdminBean.java:85) - DoThat Was Run 

のはなぜですリストを実行していますか?冗長ではありませんか?

+0

JSFがなぜそれを呼び出すのかについて、stacktraceは十分なヒントを与えるべきです。クラス/メソッド名は、通常かなり自己記述的です。まさにあなたが理解していない部分を詳しく説明できますか?また、ビュー(最低でも「」から「」まで)とモデル(最終的に問題のゲッターを表示/表示しているBean全体)を理解しやすくするには、ビューの最小でも**完全な**サンプルを提供してくださいあなたの問題。今のところ、この質問は広すぎて合理的に答えられない。あなたが話しているゲッターがはっきりしない。 – BalusC

+0

@Baluscありがとうございました。複雑なアプリだから詳細には入りませんでした。私は主に、すべてのコードをここに入れるのではなく、自分自身を調べる方法*に焦点を当てたいと思っています。私はスタックトレースを置くでしょう。多分あなたはヒントを指すことによって助けることができます.. – Ben

+0

あなたの遊び場プロジェクトでSSCCEを作成するだけですか? – BalusC

答えて

1

私はMyFacesを使用しないため、具体的な内容は記載しません。しかし、価値があるものについては、Mojarraでgetterは<ui:repeat>とも呼ばれます。しかし、スタックは何が起こっているかについてはっきりしています。ここThread#dumpStack()FacesServlet#service()までです:

java.lang.Exception: Stack trace 
    at java.lang.Thread.dumpStack(Thread.java:1249) 
    at mypackage.Bean.getList(Bean.java:21) 
    at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:302) 
    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.TagValueExpression.getValue(TagValueExpression.java:109) 
    at com.sun.faces.facelets.component.UIRepeat.getValue(UIRepeat.java:272) 
    at com.sun.faces.facelets.component.UIRepeat.getDataModel(UIRepeat.java:248) 
    at com.sun.faces.facelets.component.UIRepeat.setIndex(UIRepeat.java:442) 
    at com.sun.faces.facelets.component.UIRepeat.doVisitChildren(UIRepeat.java:661) 
    at com.sun.faces.facelets.component.UIRepeat.visitTree(UIRepeat.java:619) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600) 
    at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:240) 
    at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:188) 
    at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:452) 
    at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148) 
    at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303) 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:189) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) 
    // Remnant omitted for brevity. 

状態管理は、コンポーネント全体のツリーを訪問する必要があるときには、このように復元ビューフェーズの間に起こっています。UIRepeatは、その子が訪問されるときに行インデックスを設定する必要があります。

UIRepeat#doVisitChildren()ソースによれば、行インデックスは-1に設定されています。最終的な目標は、モデル値を繰り返したり、何かをレンダリングしたりするのではなく、ツリー内の子どもたちを訪問することです。行インデックスを設定できるようにするには、DataModelが必要です。 datamodelの値は、getterが呼び出されていることを確認しているリストです。何か問題がなければ、復元フェーズフェーズ中にこのゲッターを1回だけ呼び出す必要があります。しかし、例えばレンダリングのレスポンス段階でもこのメソッドが呼び出された場合、これは完全に不要になるため、これについて心配している可能性があります。

+0

ありがとう君は。 JSFで学ぶことがたくさんあります。 – Ben

関連する問題