我无法在 ViewHandler 中检索包含 EL 的属性。

作为一个最小的例子,这是我的 ViewHandler。它只是查找属性 "attributeName" 并打印出它的值。

public class MiniViewHandler extends ViewHandlerWrapper
{
  private ViewHandler defaultViewHandler = null;

  public MiniViewHandler()
  {
  }

  public MiniViewHandler(ViewHandler defaultViewHandler)
  {
    super();
    this.defaultViewHandler = defaultViewHandler;
  }

  @Override
  public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException
  {
    viewToRender.visitTree(VisitContext.createVisitContext(context),
            new VisitCallback()
            {

              @Override
              public VisitResult visit(VisitContext context, UIComponent target)
              {
                if (target.getAttributes().containsKey("attributeName"))
                {
                  System.out.println("Found it: " + target.getAttributes().get("attributeName"));
                }

                return VisitResult.ACCEPT;
              }
            }
    );

    defaultViewHandler.renderView(context, viewToRender);
  }

  @Override
  public ViewHandler getWrapped()
  {
    return defaultViewHandler;
  }
}

这在 faces-config.xml 中注册。我正在点击的 xhtml:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
<h:body>
    <f:view>
        <f:attribute name="attributeName" value="#{2 + 5}"/>
    </f:view>
    <f:view>
        <f:attribute name="attributeName" value="2 + 5"/>
    </f:view>
</h:body>
</html>

记录的输出显示仅选择了非 EL 属性。
INFO  [stdout] (http-/127.0.0.1:8080-1) Found it: 2 + 5

最佳答案

错误在这里:

if (target.getAttributes().containsKey("attributeName"))
您正在使用 containsKey() 检查是否已指定属性。但是,如果属性是 ValueExpression ,这将不起作用。这是 UIComponent#getAttributes() javadoc 的摘录,重点是:

因此,它总是为组件的属性返回 falsecontainsKey(阅读:组件的 ValueExpression s)。这是因为动态属性没有存储在属性映射中,而是通过 UIComponent#setValueExpression() 调用存储在组件实例本身中。它们仅在调用 get() 时解决。
您基本上需要按如下方式更改错误的行,这也适用于“静态”属性:
Object value = target.getAttributes().get("attributeName");
if (value != null) {
    System.out.println("Found it: " + value);
}
如果您想检查是否实际设置了属性,即使它会像 null 一样评估 value="#{bean.returnsNull}" ,那么您应该检查 UIComponent#getValueExpression() 是否不返回 null
if (target.getValueExpression("attributeName") != null) {
    System.out.println("Found it: " + target.getAttributes().get("attributeName"));
}
然而,这反过来不适用于“静态”属性。如有必要,您可以结合检查,具体取决于具体的功能要求。

关于jsf - <f :attribute value ="#{some EL expression}"> not found via getAttributes(). containsKey(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25638918/

10-11 01:39