我希望你正在观察的只是EL和VDL所需的行为。
也就是说,通过引入您自己的解析器代码,您可以记录一些有限但潜在有用的信息。
的VariableResolver解决顶层工件:
package logs;
import java.util.logging.*;
import javax.faces.context.FacesContext;
import javax.faces.el.*;
@SuppressWarnings("deprecated")
public class LogVariableResolver extends VariableResolver {
private static final Logger LOG =
Logger.getLogger(LogVariableResolver.class.getName());
private final VariableResolver decorated;
public LogVariableResolver(VariableResolver decorated) {
this.decorated = decorated;
}
@Override
public Object resolveVariable(FacesContext context, String name)
throws EvaluationException {
Object resolved = decorated.resolveVariable(context, name);
if (resolved == null && LOG.isLoggable(Level.WARNING)) {
LOG.warning("Unresolved: " + name);
} else {
LOG.info("Resolved: " + name + " " + resolved);
}
return resolved;
}
}
的PropertyResolver解析上的对象的属性:
package logs;
import java.util.logging.*;
import javax.faces.el.*;
@SuppressWarnings("deprecated")
public class LogPropertyResolver extends PropertyResolver {
private static final Logger LOG =
Logger.getLogger(LogPropertyResolver.class.getName());
private final PropertyResolver decorated;
public LogPropertyResolver(PropertyResolver pr) {
this.decorated = pr;
}
@Override
public Object getValue(Object base, Object property)
throws EvaluationException, PropertyNotFoundException {
return log(decorated.getValue(base, property), base, property);
}
@Override
public Object getValue(Object base, int index)
throws EvaluationException, PropertyNotFoundException {
return log(decorated.getValue(base, index), base, index);
}
private Object log(Object result, Object base, Object prop) {
if (result == null && LOG.isLoggable(Level.WARNING)) {
LOG.warning("Result null for property " + prop + " on " + base);
}
return result;
}
// implement remaining methods to call delegate & return values
解析器可以在faces-config.xml中登记:
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<application>
<variable-resolver>logs.LogVariableResolver</variable-resolver>
<property-resolver>logs.LogPropertyResolver</property-resolver>
</application>
<!-- etc -->
这些类型已被弃用,但使用它们比配置ELContext更容易。
由于您想调试EL表达式,因此这与JSF没有直接关系,我认为您应该查看EL实现的文档,这取决于运行应用程序的服务器。 – LaurentG