Sun Java System Application Server Platform Edition 9 发行说明

JavaServer Faces

本节介绍已知的 JavaServer Faces (JSF) 问题和相应的解决方案。请注意,通过访问 JSF 项目 Web 站点,可以找到有关 JSF 项目的附加信息以及提交可能遇到的所有 JSF 错误。

JSF 1.1 - 1.2 违规:变量和属性解析器 (ID 6419278)

使用 VariableResolver 装饰来扩展表达式语言功能性的 JavaServer Faces 技术应用程序可能无法正常工作。

JavaServer Faces 技术规范 的第 10.4.5 条规定:

“替换默认的 PropertyResolverVariableResolverActionListenerNavigationHandlerViewHandlerStateManager 时,将利用装饰程序的设计模式,从而在您提供具有一个合适参数类型的构造函数时,自定义实现会收到对先前履行该职责的实现的引用。这样,自定义实现可以只覆盖功能的子集(或只提供某些附加功能)并将剩余部分委托给现有实现。”

在 Application Server 9 中,自定义的 VariableResolver 实现将收到未完全履行变量解析职责的“先前”的 VariableResolver

解决方法

我们建议不委托“先前”的 VariableResolver 来解析表达式,而是创建 ValueExpression 并计算它的值。


示例 3–1 计算 ValueExpression 的值

public class CustomVR extends VariableResolver {

    private VariableResolver previous = null;

    public CustomVR(VariableResolver previous) {
	this.previous = previous;
    }
  
    public Object resolveVariable(FacesContext context, String name)
	throws EvaluationException {
	Object result = null;
	
	// Do some action that may resolve the variable.  If not, you
	// may be tempted to simply do: 

	// result = previous.resolveVariable(context, name);

	// But this would not work due to bug 6419278.  A fix is
	// available, please see the Release Notes.  However, a
	// workaround is the following.

	ValueExpression ve = context.getApplication().getExpressionFactory(). \
createValueExpression(context.getELContext(), "#{" + name + "}", Object.class);
	try {
	    result = ve.getValue(context.getELContext());
	}
	catch (PropertyNotFoundException pnfe) {
	    throw new EvaluationException(pnfe);
	}
	catch (ELException ele) {
	    throw new EvaluationException(ele);
	}
	return result;

    }
}