我无法在 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 的摘录,重点是:因此,它总是为组件的属性返回
false
的 containsKey
(阅读:组件的 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/