2012-05-16 200 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')。 –