Я хотел бы включить '/' или '\' в путь в моей аннотации @PropertySource, чтобы он работал под Linux или Windows.
я пытался
@PropertySource("${dir} + #{T(File).separator} + "${name}")
и ряд вариаций, но безуспешно.
Как я могу включить в свой @PropertySource символ разделителя пути к файлу, не зависящий от платформы?




Вы правы, странно, как эта проблема может относиться к множеству людей (например, среда разработки Windows или среда prod Unix и т. д.).
Естественным ответом будет то, что вы просто поместите правую завершающую «косую черту» в конце фактического свойства dir в том же формате, что и тип пути к файлу для конкретной ОС. Иначе...
Вот решение, предполагая, что вам предоставлен ${dir} в собственном формате файловой системы среды ОС и путь к файлу name, вы можете сделать:
@PropertySource(name = "theFileInDir.properties",value = { "file:${dir}" }, factory = OSAgnosticPropertySourceFactory.class)
Затем вы должны создать PropertySourceFactory для элемента аннотации @PropertySource#factory следующим образом:
public class OSAgnosticPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
Path resolvedFilePath = Paths.get(resource.getResource().getURI()).resolve(name);
EncodedResource er = new EncodedResource(new PathResource(resolvedFilePath), resource.getCharset());
return (name != null ? new ResourcePropertySource(name, er) : new ResourcePropertySource(er));
}
}
Мне нравится мое решение, потому что вы можете использовать основные элементы (например, элементы name, value и factory) в самой аннотации @PropertySource для определения местоположения файла, не зависящего от ОС, с помощью Java 7 Path.
Вы можете сделать больше с PropertySourceFactory, но я думаю, что вам этого должно хватить. Я бы хотел увидеть другие ответы на этот вопрос; Я сам столкнулся с этой проблемой, поэтому я рад, что вы заставили меня задуматься о том, как ее решить!