Исходный каталог пакета Spring [target / config] не существует


У меня есть пакетное приложение spring, которое имеет свойство file batch-default.свойства, настроенные как

Партия.работа.конфигурация.файл.dir=target / config

Теперь это приложение хорошо работает на моей локальной машине, хотя у меня нет такого каталога, но когда я пытаюсь развернуть его на моем сервере интеграции, я получаю ошибку:

Cannot resolve reference to bean 'org.springframework.integration.config.SourcePollingChannelAdapterFactoryBean#0.source' while setting bean property 'source'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.SourcePollingChannelAdapterFactoryBean#0.source': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Source directory [target/config] does not exist.
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:334)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1417)

Сталкивался ли кто-нибудь с подобной проблемой?

Любая помощь прилагается здесь.

- Вайбхав

1 5

1 ответ:

У нас была аналогичная проблема на нашем тестовом сервере. Похоже на проблему с правами доступа к файлам, т. е. Spring Batch Admin пытается создать структуру каталогов для "target / config", но пользователю не разрешается создавать каталоги.

Это цепочка, вызывающая проблему:

META-INF/spring/batch/bootstrap/integration/configuration-context.xml содержит определение средства опроса файлов, ссылающегося на СВОЙСТВО:

<file:inbound-channel-adapter directory="${batch.job.configuration.file.dir}" channel="job-configuration-files"
        filename-pattern=".*\.xml">
        <poller max-messages-per-poll="1" cron="5/1 * * * * *" />
    </file:inbound-channel-adapter>

Проверка документации адаптера входящего канала показывает следующее (весна-интеграция-файл-2.1.xsd):

 <xsd:attribute name="directory" type="xsd:string" use="required">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[Specifies the input directory (The directory to poll from) e.g.:
                    directory="file:/absolute/input" or directory="file:relative/input"]]></xsd:documentation>
                </xsd:annotation>            
            </xsd:attribute>

И (!)

 <xsd:attribute name="auto-create-directory" type="xsd:string" default="true">
                <xsd:annotation>
                    <xsd:documentation>
                        Specify whether to automatically create the source directory if it does not yet exist when this
                        adapter is being initialized. The default value is 'true'. If set to 'false' and the directory
                        does not exist upon initialization, an Exception will be thrown.
                    </xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>

Таким образом, в результате auto-create-directory истинно, и Spring пытается создать (относительную) структуру каталогов где-то на пути оболочки вашего сервера.

Для сообщения об ошибке проверка класса java org.springframework.integration.file.FileReadingMessageSource дает объяснение:

if (!this.directory.exists() && this.autoCreateDirectory) {
            this.directory.mkdirs();
        }
        Assert.isTrue(this.directory.exists(),
                "Source directory [" + directory + "] does not exist.");

Явадок java.io.File.mkdirs() говорит:

public boolean mkdirs()

Creates the directory named by this abstract pathname, including any necessary but nonexistent parent directories. Note that if this operation fails it may have succeeded in creating some of the necessary parent directories.

Returns:
    true if and only if the directory was created, along with all necessary parent directories; false otherwise

Итак, что происходит, mkdirs() возвращает "false", потому что он не смог создать каталог. Существует следующее () воля также возвращают "ложь" возвращается сообщение об ошибке, как указано в исходном посте.

Обходным путем можно установить параметр в существующий и доступный для записи каталог, например "/ tmp", используя абсолютный путь. К сожалению, я понятия не имею, как должна работать эта функция spring batch, если вы храните свои определения заданий на пути к классу; было бы более разумно не использовать средство опроса файлов, а использовать средство опроса файлов "с учетом пути к классу"...