Sitemesh,无法构建Factory:com.opensymphony.module.sitemesh.factory.DefaultFactory:

时间:2015-07-13 08:53:15

标签: java html spring jsp sitemesh

我使用SiteMesh版本2.4.2和Spring

<dependency>
        <groupId>opensymphony</groupId>
        <artifactId>sitemesh</artifactId>
        <version>2.4.2</version>
    </dependency>

我使用名称 myApp.war 部署我的应用程序,一切正常。我需要部署应用程序 myapp ## versionApp.war 名称,此名称会产生问题。

错误是

  

无法构造Factory:com.opensymphony.module.sitemesh.factory.DefaultFactory:com.opensymphony.module.sitemesh.factory.FactoryException:无法读取配置文件:/WEB-INF/sitemesh.xml:java.io。 FileNotFoundException:

我发现WEB-INF /目录/文件中存在sitemesh.xml。

你能帮助我吗?

3 个答案:

答案 0 :(得分:1)

我们在版本2.4中有相同的

DefaultFactory将尝试使用ServletContext()。getRealPath(),但最终会尝试从contexPath读取。我认为这是一个错误。

要解决此问题,您必须创建自己的工厂并将其设置在web.xml环境中

复制代码的DefaultFactory

public class MyFactory extends com.opensymphony.module.sitemesh.factory.BaseFactory {

    public MyFactory () {
        // Do stuff
        // delete every thing that sets the config path or simply set

        String configFile = null;

        // Do stuff
    }
    // Do other stuff
}

您的web.xml将如此

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

        <env-entry>
            <env-entry-name>sitemesh.factory</env-entry-name>
            <env-entry-type>java.lang.String</env-entry-type>
            <env-entry-value>my.sitemesh.MyFactory</env-entry-value>
        </env-entry>

答案 1 :(得分:0)

在将旧版应用程序的Tomcat版本从7升级到9时,我在2.3版中遇到了同样的问题。

问题是DefaultFactory类的这两行。

 this.configFileName = config.getServletContext().getInitParameter("sitemesh.configfile");
 .
 .
 .
 .

 is = this.configFile.toURL().openStream();

通过将web.xml文件上的configFileName定义为上下文参数,可以解决文件名问题。

<context-param>
    <param-name>sitemesh.configfile</param-name>
    <param-value>/WEB-INF/sitemesh.xml</param-value>
</context-param>

在配置文件流上不赞成使用方法会导致问题。要解决此问题,应编写自定义工厂类。您可以直接复制defaultFactory并替换此行

 is = this.configFile.toURL().openStream();

与此

 is = new FileInputStream(this.configFile);

此更改将解决输入流问题。

我的添加环境条目,您可以将自定义类添加到sitemesh。此行应放置在web.xml文件中

<env-entry>
    <env-entry-name>sitemesh.factory</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>your.custom.factory.SitemeshFactory</env-entry-value>
</env-entry>

答案 2 :(得分:0)

DefaultFactory.java使用Deprecate File.toURL()API。读取sitemesh.xml文件时出现问题。

请将您的sitemesh版本更新为sitemesh:2.5-atlassian-11

sitemesh:2.5-atlassian-11 Bugfix commit