Jsf primefaces p:outputLabel未为UIInput设置标签当它是Omnifaces树的子级时使用其值

Jsf primefaces p:outputLabel未为UIInput设置标签当它是Omnifaces树的子级时使用其值,jsf,primefaces,omnifaces,Jsf,Primefaces,Omnifaces,p:outputLabel将为相关的UIInput设置标签,但当它是Omnifaces o:tree的子级时,它不起作用。验证错误消息仍然使用clientId Omnifaces outputLabel可以为相关UIComponent设置标签,并且可以使用o:tree Primefaces在endEncode方法中设置标签,当使用o:tree时,在endEncode之前调用validateValue方法 有人有解决办法吗 更新: 版本: 爪哇7 手册1.5.1(myfaces 2.1.9) P

p:outputLabel将为相关的UIInput设置标签,但当它是Omnifaces o:tree的子级时,它不起作用。验证错误消息仍然使用clientId

Omnifaces outputLabel可以为相关UIComponent设置标签,并且可以使用o:tree

Primefaces在endEncode方法中设置标签,当使用o:tree时,在endEncode之前调用validateValue方法

有人有解决办法吗

更新: 版本:

  • 爪哇7
  • 手册1.5.1(myfaces 2.1.9)
  • Primefaces-3.4.1
  • omnifaces-1.3-SNAPSHOT-20121121
只能使用myfaces进行复制,使用Mojarra,最后一个节点中的标签值将用于其他节点的无效消息

  • A
  • A

    • 我可以重现您的问题。这个问题与OmniFaces
      无关,但它实际上是PrimeFaces的一个bug。作为证据,尝试在
      中使用它,您将看到完全相同的问题出现

      至于它为什么与OmniFaces一起工作,那是因为它在关联的输入组件中将标签设置为
      ValueExpression
      。PrimeFaces one设置当前评估的值,而该值在消息被请求时不一定是正确的值


      我建议将它作为一个报告给PrimeFaces的家伙,并使用

      进行演示。这个问题有两个部分。其中一个在最前面。它将计算值设置为UIInput的label属性,而不是ValueExpression。所以所有数据都使用相同的标签。 第二个是兼容性问题。Myfaces 2.1.9是JSF2.1,需要
      组件
      尊重
      访问。跳过迭代
      。我们不支持它。这是一个使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;
              }
      
      更新: 此修补程序与JSF2.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;
              }
      
      diff-r 0c0b57aa6780 src/org/omnifaces/component/tree/TreeFamily.java
      ---a/src/org/omnifaces/component/tree/TreeFamily.java周五11月30日12:39:03 2012-0400
      +++b/src/org/omnifaces/component/tree/TreeFamily.java周一至十二月三日09:33:00 2012+0800
      @@ -16,6 +16,8 @@
      导入javax.faces.FacesException;
      导入javax.faces.component.UIComponentBase;
      +导入javax.faces.component.visit.VisitContext;
      +导入javax.faces.component.visit.visitint;
      导入javax.faces.context.FacesContext;
      导入javax.faces.event.PhaseId;
      @@ -136,4 +138,24 @@
      }
      }
      +   /**
      +    * 
      +    * 
      +*@param context面上下文
      +*@param visitContext访问树上下文
      +*@返回
      +    */
      +布尔ISSKIPingation(最终访问上下文访问上下文){
      +       //
      +试一试{
      +//JSF 2.1
      +VisitHint skipHint=VisitHint.valueOf(“跳过迭代”);
      +返回visitContext.getHights().contains(skipHint);
      +       }
      +捕获(IllegalArgumentException e){
      +//JSF2.0
      +Object skipHint=visitContext.getFacesContext().getAttributes().get(“javax.faces.visit.SKIP_迭代”);
      +返回Boolean.TRUE.equals(skipHint);
      +       }
      +   }
      }
      \文件末尾没有换行符
      diff-r 0c0b57aa6780 src/org/omnifaces/component/tree/TreeInsertChildren.java
      ---a/src/org/omnifaces/component/tree/TreeInsertChildren.java周五11月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 @@
      */
      @凌驾
      公共布尔visitTree(VisitContext上下文,VisitCallback回调){
      +if(ISSkipingGitation(上下文)){
      +返回super.visitTree(上下文,回调);
      +       }
      返回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周五11月30日12:39:03 2012-0400
      +++b/src/org/omnifaces/component/tree/TreeNodeItem.java周一至十二月三日09:33:00 2012+0800
      @@ -119,6 +119,10 @@
      @凌驾
      @SuppressWarnings({“rawtypes”,“unchecked”})//用于树模型。无论如何,我们不关心它的实际类型。
      公共布尔visitTree(最终VisitContext上下文,最终VisitCallback回调){
      +if(ISSkipingGitation(上下文)){
      +返回super.visitTree(上下文,回调);
      +       }
      +       
      如果(!isVisitable(上下文)| | getChildCount()==0){
      返回false;
      }
      
      你的意思是,你有类似于
      的东西,并且消息显示的是输入的客户端ID而不是标签值?很抱歉,不能用Mojarra 2.1.14、PrimeFaces 3.4.2和最新的OmniFaces snapshot复制它。一个具体的例子以及使用的库版本会很有用。Yes只能用myfaces复制。但是Mojarra使用的是其他节点的最后一个节点的标签。我附加了示例。向primefaces添加了一个。但是使用
      ,Myfaces和Mojarra具有相同的行为。使用
      和Myfaces时,似乎标签属性在回发时未恢复。我发现使用
      和Myfaces时未调用
      恢复属性。但使用
      和Myfaces时调用了Mojarrad、 这是Myfaces的问题吗?
      VisitHint.SKIP_ITERATION
      是JSF 2.1特有的。OmniFaces的目标是与JSF 2.0兼容。我只能让它在编译时与JSF 2.0兼容。它是根据添加的。感谢您的贡献。