2014-02-27 33 views
3

我有问题,当尝试获取不存在的参数/上下文值时,我没有在日志或页面中获得任何反馈消息。使用EL时的日志/反馈消息

有什么办法,使详细的EL错误日志记录,我已经加了一些我行内的web.xml:

<context-param> 
    <param-name>javax.faces.FACELETS_DEVELOPMENT</param-name> 
    <param-value>true</param-value> 
</context-param> 

但是,这并没有帮助。

+0

由于您想调试EL表达式,因此这与JSF没有直接关系,我认为您应该查看EL实现的文档,这取决于运行应用程序的服务器。 – LaurentG

回答

1

我希望你正在观察的只是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更容易。

+0

干净利落的处理方法。非常感谢! –