2012-05-16 121 views
2

我想創建一個簡單的Spring 3 MVC應用程序與瓷磚集成。春天MVC和瓷磚集成問題

當我嘗試構建應用程序,我得到(截斷簡潔)此錯誤消息:

java.lang.NullPointerException 
at org.apache.commons.digester.Digester.getXMLReader(Digester.java:1058) 
at org.apache.commons.digester.Digester.parse(Digester.java:1887) 
at org.apache.tiles.definition.digester.DigesterDefinitionsReader.read(DigesterDefinitionsReader.java:329) 
at org.apache.tiles.definition.dao.BaseLocaleUrlDefinitionDAO.loadDefinitionsFromURL(BaseLocaleUrlDefinitionDAO.java:276) 
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:251) 

我失去了一些所需的庫?

我在WEB-INF/lib文件夾中有以下jar包。

commons-beanutils-1.8.0.jar 
commons-digester-2.0.jar 

org.springframework.asm-3.1.1.RELEASE.jar 
org.springframework.beans-3.1.1.RELEASE.jar 
org.springframework.context-3.1.1.RELEASE.jar 
org.springframework.core-3.1.1.RELEASE.jar 
org.springframework.expression-3.1.1.RELEASE.jar 
org.springframework.web.servlet-3.1.1.RELEASE.jar 
org.springframework.web-3.1.1.RELEASE.jar 
tiles-api-2.2.2.jar 
tiles-core-2.2.2.jar 
tiles-jsp-2.2.2.jar 
tiles-servlet-2.2.2.jar 
tiles-template-2.2.2.jar 
log4j-1.2.16.jar 
slf4j-api-1.6.4.jar 
slf4j-log4j12-1.6.4.jar 

WEB-INF/web.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
<display-name>SpringMVC</display-name> 
    <servlet> 
<servlet-name>spring</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
<servlet-name>spring</servlet-name> 
<url-pattern>*.html</url-pattern> 
</servlet-mapping> 

<welcome-file-list> 
<welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 
</web-app> 

WEB-INF /彈簧servlet.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> 

<!-- Scans within the base package of the application for @Components to configure as beans --> 
<!-- @Controller, @Service, @Configuration, etc. --> 
<context:component-scan base-package="xyz.sample.baremvc" /> 

<!-- Enables the Spring MVC @Controller programming model --> 
<mvc:annotation-driven /> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> 
</bean> 

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
    <property name="definitions"> 
     <list> 
      <value>/WEB-INF/tiles.xml</value> 
     </list> 
    </property> 
</bean> 

WEB-INF/tiles.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE tiles-definitions PUBLIC 
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" 
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd"> 
<tiles-definitions> 
    <definition name="base.definition" template="/WEB-INF/views/layout.jsp"> 
    <put-attribute name="title" value="" /> 
    <put-attribute name="header" value="/WEB-INF/views/header.jsp" /> 
    <put-attribute name="menu" value="/WEB-INF/views/menu.jsp" /> 
    <put-attribute name="body" value="" /> 
    <put-attribute name="footer" value="/WEB-INF/views/footer.jsp" /> 
    </definition> 

    <definition name="contact" extends="base.definition"> 
    <put-attribute name="title" value="Contact Manager" /> 
    <put-attribute name="body" value="/WEB-INF/views/contact.jsp" /> 
    </definition> 
</tiles-definitions> 

感謝

回答

6

利用公共沼氣池-1.8.jar瓷磚2.2.2,公共沼氣池的2.0版本是關於薩克斯馬車。

編輯:額外的我用來解決這個問題 它解決了最初的HTTP請求這是一個已知問題的聚甲醛(注意:我現在用的是JDK 1.6)這裏是我的POM的一個額外的,使其工作:

 <!-- Note: tiles 2.2 uses commons-digester 2.0 which is buggy with sax 
      (http request will fail the first time) using version 1.8 to solve the issue --> 
     <dependency> 
      <groupId>commons-digester</groupId> 
      <artifactId>commons-digester</artifactId> 
      <version>1.8</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tiles</groupId> 
      <artifactId>tiles-servlet</artifactId> 
      <version>${apacheTiles.version}</version> 
      <exclusions> 
       <exclusion> 
        <groupId>commons-digester</groupId> 
        <artifactId>commons-digester</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tiles</groupId> 
      <artifactId>tiles-jsp</artifactId> 
      <version>${apacheTiles.version}</version> 
     </dependency> 

與$ {} apacheTiles.version是2.2.2和春季的版本是3.0.5.RELEASE

+0

我在瓷磚2.2.2本身的發行版中獲得了commons-digestor-2.0。 –

+0

在jdk 1.6(也可能是其他上下文)下,異常只發生在第一個http請求上,進一步的http請求將會起作用。我使用pom的摘錄編輯了我的帖子以解決問題。 – Farid

+0

適合我。謝謝! – Dani

1

我假設com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl正在從第三方庫稱。確保它是從Sun的jre庫中引用的。

如果您使用的是maven,請嘗試從類路徑中排除任何不需要的庫。

or refer to this post

編輯:

看這一段代碼從org.apache.commons.digester.parser.XercesParser

public static SAXParser newSAXParser(Properties properties) 
     throws ParserConfigurationException, 
       SAXException, 
       SAXNotSupportedException { 

    SAXParserFactory factory = 
        (SAXParserFactory)properties.get("SAXParserFactory"); 

    if (versionNumber == null){ 
     versionNumber = getXercesVersion(); 
     version = new Float(versionNumber).floatValue(); 
    } 

    // Note: 2.2 is completely broken (with XML Schema). 
    if (version > 2.1) { 

     configureXerces(factory); 
     return factory.newSAXParser(); 
    } else { 
     SAXParser parser = factory.newSAXParser(); 
     configureOldXerces(parser,properties); 
     return parser; 
    } 
    } 
+0

我檢查了項目的構建路徑,並且還有兩個具有SAXParserFactoryImpl類的Jars。我刪除了這兩個jar,現在只有JRockit的SAXParserFactoryImpl存在,但問題仍然存在。 –

+0

我不確定您是否已經在這段時間解決了問題。但基於Digester類的代碼(http://grepcode.com/file/repo1.maven.org/maven2/commons-digester/commons-digester/2.0/org/apache/commons/digester/Digester.java#Digester .getXMLReader%28%29)他們期待Xerces版本號> 2.1 – vinodn

0
取代

公地-消化器-2.0與公地消化器-1.7 瓷磚2.2.2解決這個問題。

+2

這與以前的答案建議的解決方案基本相同。除了改變'commons-digestor'的推薦版本之外,它對問題或答案几乎沒有新的價值。你的答案可以通過一些理由或解釋來改善,爲什麼版本'1.7'應該是首選的(例如超過'1.8')。 –