Sitemesh, невозможно построить Factory: com.opensymphony.module.sitemesh.factory.DefaultFactory:

Я использую версию 2.4.2 SiteMesh с 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.

Можете вы помочь мне?


person user5301    schedule 13.07.2015    source источник


Ответы (3)


У нас так же было в версии 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>
person Huub    schedule 01.07.2016

У меня была такая же проблема в версии 2.3 при обновлении версии Tomcat с 7 до 9 для нашего устаревшего приложения.

Проблема заключалась в этих двух строках в классе DefaultFactory.

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

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

Определив configFileName в файле web.xml в качестве параметра контекста, можно решить проблему с именем файла.

<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>
person uğur taş    schedule 06.04.2020

DefaultFactory.java использует API Deprecate File.toURL(). есть проблема с чтением файла sitemesh.xml.

Обновите версию сетки сайта до sitemesh:2.5-atlassian-11.

sitemesh:2.5-atlassian-11 Исправление ошибки

person s-han.lee    schedule 29.05.2020