2

我正在尝试使用磁贴集成创建一个简单的 Spring 3 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 文件夹中有以下罐子。

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/spring-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>

谢谢

4

3 回答 3

6

将 commons-digester-1.8.jar 与瓷砖 2.2.2 一起使用,commons-digester 的 2.0 版在 sax 方面存在缺陷。

编辑:我用来解决问题的额外 pom 是为了解决初始 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,spring 的版本为 3.0.5.RELEASE

于 2012-05-16T13:24:05.590 回答
1

我假设com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl是从第三方库引用的。确保它是从 Sun 的 jre 库中引用的。

如果您使用的是 maven,请尝试从类路径中排除任何不需要的库。

或参考这篇文章

编辑:

看看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;
    }
   }
于 2012-05-16T13:32:12.883 回答
0

用 commons-digestor-1.7 替换 2.2.2 的 commons-digestor-2.0 来解决这个问题。

于 2014-09-18T08:49:40.020 回答