2014-05-22 67 views
0

我嘗試使用下面的代碼在獨立模式下運行EL 3.0在Tomcat 8一個servlet內 -在Tomcat以獨立模式運行EL 3.0 Servlet中8

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    request.setAttribute("name", "Test1"); 

    ELProcessor processor = new ELProcessor(); 
    processor.getELManager().addBeanNameResolver(new BeanNameResolver() { 
    @Override 
    public Object getBean(String beanName) { 
     return request.getAttribute(beanName); 
    } 
    }); 

    response.getWriter().write((String)processor.eval("name")); 
} 

在EL 3.0提及的各種文章,爲了解析一個bean,它應該首先使用ELProcessor.defineBean()來定義。然而,使用上面定義的自定義bean解析器,它應該能夠從請求中解析bean。當我運行在Tomcat上8這段代碼,它顯示了以下錯誤 -

javax.el.PropertyNotFoundException: ELResolver cannot handle a null base Object with identifier 'name' 
org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:100) 
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187) 
javax.el.ELProcessor.getValue(ELProcessor.java:45) 
javax.el.ELProcessor.eval(ELProcessor.java:38) 
org.koyad.servlet.TestELServlet.doGet(TestELServlet.java:59) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

可能有人請解釋這種現象?

回答

0

獨立的javax.el.E​​LProcessor如果在表達式條件中找到未定義的變量名,將引發此異常。您甚至無法爲未定義的變量寫入空檢查:如果在此之前尚未設置此變量,則會發出異常: ${empty unknownVariable} 將引發異常。如果它已被設置爲null,那麼它將返回true

當您提供自定義BeanNameResolver實現時,您還需要重寫其他方法。例如,isNameResolved方法用於指示您的解析器實際解決了此值。

我有一個使用自定義環境類(基本地圖,類似於你的要求)的自定義BeanNameResolver:

public static class EnvironmentBeanNameResolver extends BeanNameResolver{ 

    private Environment environment; 

    public EnvironmentBeanNameResolver(Environment environment){ 
     this.environment = environment; 
    } 

    @Override 
    public boolean isNameResolved(String beanName){ 
     return environment.containsAttribute(beanName); 
    } 

    @Override 
    public Object getBean(String beanName){ 
     return environment.getAttribute(beanName); 
    } 

    @Override 
    public void setBeanValue(String beanName, Object value){ 
     environment.setAttribute(beanName, value); 
    } 

    @Override 
    public boolean isReadOnly(String beanName){ 
     return false; 
    } 

    @Override 
    public boolean canCreateBean(String beanName){ 
     return true; 
    } 

} 

,我使用它像這樣

ELProcessor processor = new ELProcessor(); 
processor.getELManager().addBeanNameResolver(new EnvironmentBeanNameResolver(environment)); 
boolean result = (boolean)processor.eval("empty knownVariable");