2013-03-09 70 views
1

版本:速度-1.7,公地集合-3.2)使用速度,發生 「顯示java.lang.NullPointerException」

我使用速度解析VM模板,和設定值在request範圍,顯示在JSP

我的應用程序work normaly a period of time,但是當用戶訪問了一段時間後,這個JSP顯示錯誤,無法訪問

這裏是登錄

Mar 8, 2013 11:40:54 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet spring threw exception 
java.lang.NullPointerException 
    at org.apache.commons.collections.ExtendedProperties.clearProperty(ExtendedProperties.java:797) 
    at org.apache.commons.collections.ExtendedProperties.setProperty(ExtendedProperties.java:722) 
    at org.apache.commons.collections.ExtendedProperties.combine(ExtendedProperties.java:783) 
    at org.apache.velocity.runtime.RuntimeInstance.setProperties(RuntimeInstance.java:657) 
    at org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:645) 
    at org.apache.velocity.runtime.RuntimeSingleton.init(RuntimeSingleton.java:226) 
    at org.apache.velocity.app.Velocity.init(Velocity.java:97) 
    at com.feilong.tools.velocity.VelocityUtil.parseVMTemplateWithClasspathResourceLoader(VelocityUtil.java:67) 
    at com.feilong.taglib.display.pager.PagerUtil.getPagerContent(PagerUtil.java:107) 
    at com.feilong.taglib.display.pager.PagerTag.writeContent(PagerTag.java:48) 
    at com.feilong.taglib.display.pager.PagerTag.writeContent(PagerTag.java:13) 
    at com.feilong.taglib.base.AbstractCommonTag.doStartTag(AbstractCommonTag.java:19) 
    at org.apache.jsp.pages.product.product_005flist_jsp._jspx_meth_feilongDisplay_005fpager_005f0(product_005flist_jsp.java:762) 
    at org.apache.jsp.pages.product.product_005flist_jsp._jspx_meth_c_005fotherwise_005f1(product_005flist_jsp.java:433) 
    at org.apache.jsp.pages.product.product_005flist_jsp._jspx_meth_c_005fchoose_005f1(product_005flist_jsp.java:243) 
    at org.apache.jsp.pages.product.product_005flist_jsp._jspService(product_005flist_jsp.java:116) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

這裏是我的UTIL代碼: (兩個公共方法:有時我用它來解析VM模板,有時我用它來解析字符串)

/** 
* VelocityUtil 
* 
* @author feilong 
    */ 
public final class VelocityUtil{ 

    private static String RUNTIME_LOG_LOG4J_LOGGER  = "feilongVelocityLogger"; 

    private static String RUNTIME_LOG_LOG4J_LOGGER_LEVEL = "debug"; 

    public static String parseVMTemplateWithClasspathResourceLoader(String templateInClassPath,Map<String, Object> contextKeyValues){ 
     String resource_loader = "class"; 
     Properties properties = new Properties(); 
     properties.put(Velocity.RESOURCE_LOADER, resource_loader); 
     properties.put(resource_loader + ".resource.loader.class", ClasspathResourceLoader.class.getName()); 
     properties.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, Log4JLogChute.class.getName()); 
     properties.put(Log4JLogChute.RUNTIME_LOG_LOG4J_LOGGER, RUNTIME_LOG_LOG4J_LOGGER); 
     properties.put(Log4JLogChute.RUNTIME_LOG_LOG4J_LOGGER_LEVEL, RUNTIME_LOG_LOG4J_LOGGER_LEVEL); 
     properties.put(Velocity.INPUT_ENCODING, CharsetType.UTF8); 
     properties.put(Velocity.OUTPUT_ENCODING, CharsetType.UTF8); 

     Velocity.init(properties); 
     return parseVMTemplateAfterInitVelocity(templateInClassPath, contextKeyValues); 
    } 


    public static String parseVMContentWithStringResourceLoader(String vmContent,Map<String, Object> contextKeyValues){ 
     String resource_loader = "string"; 
     Properties properties = new Properties(); 
     properties.put(Velocity.RESOURCE_LOADER, resource_loader); 
     properties.put(resource_loader + ".resource.loader.class", StringResourceLoader.class.getName()); 
     properties.put(Velocity.INPUT_ENCODING, CharsetType.UTF8); 
     properties.put(Velocity.OUTPUT_ENCODING, CharsetType.UTF8); 

     Velocity.init(properties); 

     String templateName = "feilongStringVelocity"; 
     StringResourceRepository stringResourceRepository = StringResourceLoader.getRepository(); 
     stringResourceRepository.putStringResource(templateName, vmContent); 
     return parseVMTemplateAfterInitVelocity(templateName, contextKeyValues); 
    } 


    private static String parseVMTemplateAfterInitVelocity(String templateName,Map<String, Object> contextKeyValues){ 
     Template template = Velocity.getTemplate(templateName, CharsetType.UTF8); 
     VelocityContext velocityContext = new VelocityContext(); 
     if (null != contextKeyValues){ 
      for (Map.Entry<String, Object> entry : contextKeyValues.entrySet()){ 
       velocityContext.put(entry.getKey(), entry.getValue()); 
      } 
     } 
     Writer writer = new StringWriter(); 
     template.merge(velocityContext, writer); 
     try{ 
      writer.flush(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
     return writer.toString(); 
    } 
} 
+0

您使用的是哪個版本的commons-collections? – orique 2013-03-09 13:30:22

+0

@orique commons-collections-3.2 – feilong 2013-03-09 13:39:18

+0

查看源代碼(http://javasourcecode.org/html/open-source/commons-collections/commons-collections-3.2/org/apache/commons/collections/ExtendedProperties.java。 HTML)看起來像你的屬性中的一些鍵是空的,但看着你的代碼我不明白它是如何有意義的。 – orique 2013-03-09 13:45:53

回答

1

如果你每次渲染初始化速度該jsp(它看起來像你是從你發佈的代碼)這可能是問題。

我以前遇到過這個問題,並通過初始化VelocityEngine並將其存儲起來以備將來使用。

here採取的措施(信貸 '威爾玻璃侯賽因-2' 從nabble.com的速度論壇):

這裏的一般模式。在應用程序啓動時,初始化一個 VelocityEngine。將它存儲在某個地方。每次需要處理 模板時,都可以使用 速度引擎合併模板(與上下文)來獲取模板,創建並填充上下文。

在上面的代碼中,您可以嘗試將Velocity.init調用移動到另一個方法(例如稱爲初始化),它只在您的utils類中首次使用方法時調用。初始化被調用一次後,將其存儲在一個布爾值中,不要再次調用初始化。