2014-02-27 28 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

乾淨利落的處理方法。非常感謝! –