Spring Resource: предостережения относительно FileSystemResource

FileSystemResource, который не присоединен к FileSystemApplicationContext (то есть, когда FileSystemApplicationContext не является фактическим ResourceLoader), обрабатывает абсолютные и относительные пути, как и следовало ожидать. Относительные пути указываются относительно текущего рабочего каталога, а абсолютные пути - относительно корня файловой системы.

Однако по причинам обратной совместимости (историческим) это изменяется, когда FileSystemApplicationContext является ResourceLoader. FileSystemApplicationContext заставляет все присоединенные экземпляры FileSystemResource рассматривать все пути к расположению как относительные, независимо от того, начинаются они с косой черты или нет. На практике это означает, что следующие примеры эквивалентны:

Java

ApplicationContext ctx =
    new FileSystemXmlApplicationContext("conf/context.xml");

ApplicationContext ctx =
    new FileSystemXmlApplicationContext("/conf/context.xml");

Kotlin

val ctx = FileSystemXmlApplicationContext("conf/context.xml")

val ctx = FileSystemXmlApplicationContext("/conf/context.xml")

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

Java

FileSystemXmlApplicationContext ctx = ...;
ctx.getResource("some/resource/path/myTemplate.txt");

FileSystemXmlApplicationContext ctx = ...;
ctx.getResource("/some/resource/path/myTemplate.txt");

Kotlin

val ctx: FileSystemXmlApplicationContext = ...
ctx.getResource("some/resource/path/myTemplate.txt")

val ctx: FileSystemXmlApplicationContext = ...
ctx.getResource("/some/resource/path/myTemplate.txt")

На практике, если вам нужны истинные абсолютные пути к файловой системе, вам следует избегать использования абсолютных путей с FileSystemResource или FileSystemXmlApplicationContext и принудительно использовать UrlResource с помощью URL префикса file: . Следующие примеры показывают, как это сделать:

Java

// фактический тип контекста не имеет значения, Resource всегда будет UrlResource
ctx.getResource("file:///some/resource/path/myTemplate.txt");

// заставляем этот FileSystemXmlApplicationContext загружать его определение через UrlResource
ApplicationContext ctx =
    new FileSystemXmlApplicationContext("file:///conf/context.xml");

Kotlin

// фактический тип контекста не имеет значения, Resource всегда будет UrlResource
ctx.getResource("file:///some/resource/path/myTemplate.txt")

// заставляем этот FileSystemXmlApplicationContext загружать его определение через UrlResource
val ctx = FileSystemXmlApplicationContext("file:///conf/context.xml")


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки