Sitemesh,无法构建工厂:com.opensymphony.module.sitemesh.factory.DefaultFactory。

4
我使用Spring与SiteMesh版本2.4.2。
<dependency>
        <groupId>opensymphony</groupId>
        <artifactId>sitemesh</artifactId>
        <version>2.4.2</version>
    </dependency>

我使用名称为myApp.war的应用程序进行部署,一切正常。但我需要部署名称为myapp##versionApp.war的应用程序,该名称会导致问题。
错误信息如下:

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

我发现在WEB-INF/directory/file中存在sitemesh.xml文件。
你能帮我解决这个问题吗?
4个回答

2

在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>

0

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

问题出在DefaultFactory类的这两行代码上。

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

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

通过在web.xml文件中定义configFileName作为context-param,可以解决文件名问题。
<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>

0

更改WEB-INF中的context-param和param-value对我有用。 我知道这不是一个完美的解决方案,但我已经尝试了很多方法,除了这个以外没有任何其他方法适用。

<context-param>
    <param-name>sitemesh.configfile</param-name>
    <param-value>/opt/tomcat/xxx/yyy/zzz/WEB-INF/sitemesh.xml</param-value>

*xxx/yyy/zzz是我的三级上下文,war文件的格式为xxx#yyy#zzz#应用名称.war


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接