Web Flow(2.3.1.RELEASE)をJSFと組み合わせて使用する場合、任意の種類の複合コンポーネント(たとえば、<h:outputLabel />
をクリックした後の1ページのコンポーネント)を使用すると、レンダリングの問題が発生します<h:commandLink />
。複合コンポーネントの内容は常にページの下部に表示されます!ページを更新すると、レンダリングは再び正常になります...
このコードを使用して、これを非常に簡単に再現できます。
私のフェイスレット:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:test="http://java.sun.com/jsf/composite/components">
<h:body>
<h:form id="form">
<h:commandLink id="link" value="link" /><br/>
<test:testComponent id="test" />
<h:outputLabel value="label" id="label" />
</h:form>
</h:body>
</html>
複合コンポーネント:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
</composite:interface>
<composite:implementation>
<h:outputText value="hello world" />
</composite:implementation>
</ui:composition>
Web Flowがフローを再開した後にビューを復元すると、コンポーネントの順序が乱れるのではないかと思います。上記のコードを(Web Flowを使用せずに)単純なJSFフェイスレットで使用すると、すべて正常に機能します。
MojarraとWebFlowの内部をデバッグしたところ、プレーンJSFを使用しているときではなく、Web Flowを使用しているときに、FaceletViewHandlingStrategyのbuildView(FacesContext ctx、UIViewRoot view)メソッドで順序が混在していることがわかります。
これとまったく同じ問題をSpringフォーラムとSpringJIRAに投稿しましたが、多くの返信はありませんでした。
この問題を見てくださった方、よろしくお願いします!