0

p:outputLabel は、関連する UIInput のラベルを設定しますが、Omnifaces o:tree の子の場合は機能しません。検証エラー メッセージでは引き続き clientId が使用されます。

Omnifaces outputLabel は、関連する UIComponent のラベルを設定でき、o:tree と連携できます。

Primefaces は endEncode メソッドでラベルを設定します。o:tree を使用する場合、endEncode の前に validateValue メソッドが呼び出されます。

誰にも回避策がありますか?

アップデート:

バージョン:

  • Java 7
  • TomEE 1.5.1 (myfaces 2.1.9)
  • Primefaces-3.4.1
  • omn​​ifaces-1.3-SNAPSHOT-20121121

myfaces でのみ再現できます。Mojarra では、最後のノードの lable の値が他のノードの無効なメッセージに使用されます。

4

2 に答える 2

2

問題を再現できます。この問題は OmniFaces とは関係ありません<o:tree>が、実際には PrimeFaces のバグ<p:outputLabel>です。証拠として、これを で使用してみて<ui:repeat>ください。まったく同じ問題が発生することがわかります。

OmniFaces で機能する理由は、関連する入力コンポーネントで<o:outputLabel>ラベルを a として設定するためです。ValueExpressionPrimeFaces は代わりに現在評価されている値を設定します。これは、メッセージに対して要求された時点で必ずしも正しい値であるとは限りません。

を使用したデモとともに、PrimeFaces 担当者に問題として報告することをお勧めし<ui:repeat>ます。

于 2012-12-01T21:24:12.093 に答える
0

この問題には 2 つの部分があります。1つはprimefaces側にあります。評価された値を、ValueExpression ではなく、UIInput の label 属性に設定します。したがって、すべてのデータは同じラベルを使用します。2 つ目は、互換性の問題です。Myfaces 2.1.9 は JSF2.1 でありComponentVisitHint.SKIP_ITERATION. Omnifaces はサポートしていません。これは Omnifaces を機能させるパッチです。

diff -r 0c0b57aa6780 src/org/omnifaces/component/tree/TreeInsertChildren.java
--- a/src/org/omnifaces/component/tree/TreeInsertChildren.java  Fri Nov 30 12:39:03 2012 -0400
+++ b/src/org/omnifaces/component/tree/TreeInsertChildren.java  Sun Dec 02 14:56:02 2012 +0800
@@ -16,6 +16,7 @@
 import javax.faces.component.UIComponent;
 import javax.faces.component.visit.VisitCallback;
 import javax.faces.component.visit.VisitContext;
+import javax.faces.component.visit.VisitHint;
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseId;

@@ -66,6 +67,11 @@
     */
    @Override
    public boolean visitTree(VisitContext context, VisitCallback callback) {
+       Boolean skipIterationHint = context.getHints().contains(VisitHint.SKIP_ITERATION);
+       if (skipIterationHint != null && skipIterationHint.booleanValue())
+       {
+           return super.visitTree(context, callback);
+       }
        return Components.getClosestParent(this, Tree.class).visitTreeNode(context, callback);
    }

diff -r 0c0b57aa6780 src/org/omnifaces/component/tree/TreeNodeItem.java
--- a/src/org/omnifaces/component/tree/TreeNodeItem.java    Fri Nov 30 12:39:03 2012 -0400
+++ b/src/org/omnifaces/component/tree/TreeNodeItem.java    Sun Dec 02 14:56:02 2012 +0800
@@ -18,6 +18,7 @@
 import javax.faces.component.UIComponent;
 import javax.faces.component.visit.VisitCallback;
 import javax.faces.component.visit.VisitContext;
+import javax.faces.component.visit.VisitHint;
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseId;

@@ -119,6 +120,12 @@
    @Override
    @SuppressWarnings({ "rawtypes", "unchecked" }) // For TreeModel. We don't care about its actual type anyway.
    public boolean visitTree(final VisitContext context, final VisitCallback callback) {
+       
+       Boolean skipIterationHint = context.getHints().contains(VisitHint.SKIP_ITERATION);
+       if (skipIterationHint != null && skipIterationHint.booleanValue())
+       {
+           return super.visitTree(context, callback);
+       }
        if (!isVisitable(context) || getChildCount() == 0) {
            return false;
        }

アップデート:

このパッチには、コンパイル時の JSF 2.0 との互換性があります。

diff -r 0c0b57aa6780 src/org/omnifaces/component/tree/TreeFamily.java
--- a/src/org/omnifaces/component/tree/TreeFamily.java  Fri Nov 30 12:39:03 2012 -0400
+++ b/src/org/omnifaces/component/tree/TreeFamily.java  Mon Dec 03 09:33:00 2012 +0800
@@ -16,6 +16,8 @@

 import javax.faces.FacesException;
 import javax.faces.component.UIComponentBase;
+import javax.faces.component.visit.VisitContext;
+import javax.faces.component.visit.VisitHint;
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseId;

@@ -136,4 +138,24 @@
        }
    }

+   /**
+    * 
+    * <a href="http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-545" >JSF Spec</a>
+    * @param context The faces context
+    * @param visitContext the visit tree context
+    * @return
+    */
+   boolean isSkippingIteration(final VisitContext visitContext) {
+       //
+       try {
+           //JSF 2.1
+           VisitHint skipHint = VisitHint.valueOf("SKIP_ITERATION");
+           return visitContext.getHints().contains(skipHint);
+       }
+       catch(IllegalArgumentException e) {
+           //JSF 2.0
+           Object skipHint = visitContext.getFacesContext().getAttributes().get("javax.faces.visit.SKIP_ITERATION");
+           return Boolean.TRUE.equals(skipHint);
+       }
+   }
 }
\ No newline at end of file
diff -r 0c0b57aa6780 src/org/omnifaces/component/tree/TreeInsertChildren.java
--- a/src/org/omnifaces/component/tree/TreeInsertChildren.java  Fri Nov 30 12:39:03 2012 -0400
+++ b/src/org/omnifaces/component/tree/TreeInsertChildren.java  Mon Dec 03 09:33:00 2012 +0800
@@ -66,6 +66,9 @@
     */
    @Override
    public boolean visitTree(VisitContext context, VisitCallback callback) {
+       if (isSkippingIteration(context)) {
+           return super.visitTree(context, callback);
+       }
        return Components.getClosestParent(this, Tree.class).visitTreeNode(context, callback);
    }

diff -r 0c0b57aa6780 src/org/omnifaces/component/tree/TreeNodeItem.java
--- a/src/org/omnifaces/component/tree/TreeNodeItem.java    Fri Nov 30 12:39:03 2012 -0400
+++ b/src/org/omnifaces/component/tree/TreeNodeItem.java    Mon Dec 03 09:33:00 2012 +0800
@@ -119,6 +119,10 @@
    @Override
    @SuppressWarnings({ "rawtypes", "unchecked" }) // For TreeModel. We don't care about its actual type anyway.
    public boolean visitTree(final VisitContext context, final VisitCallback callback) {
+       if (isSkippingIteration(context)) {
+           return super.visitTree(context, callback);
+       }
+       
        if (!isVisitable(context) || getChildCount() == 0) {
            return false;
        }
于 2012-12-02T07:01:42.670 に答える