Доступ к свойству @ConfigurationProperties по умолчанию из тимелеафа

Я пытаюсь прочитать свойство, используя тимелеаф, и не могу заставить его работать. У меня есть следующий класс свойств:

@Configuration
@ConfigurationProperties(prefix = "storage")
public class FileSystemStorageProperties {
    private String location = "image-dir";

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }
}

И я пытаюсь прочитать свойство местоположения в тимелеафе, используя

${@environment.getProperty('storage.location')}

однако ничего не отображается.

РЕДАКТИРОВАТЬ: если я установлю storage.location=to something else в application.properties, это сработает. Но почему тимелеаф не выбирает значение по умолчанию??


person Catalin    schedule 12.11.2020    source источник
comment
Что вы имеете в виду, говоря, что он не выбирает значение по умолчанию? Значение в application.properties или в вашем @Configuration классе?   -  person dan1st    schedule 12.11.2020
comment
Значение по умолчанию — image-dir. Тимелист этого не видит. Однако при ручной установке этого значения внутри application.properties Thymeleaf выбирает его. РЕДАКТИРОВАТЬ: значение в моем @Configuration   -  person Catalin    schedule 12.11.2020
comment
Я отредактировал свой ответ для этого.   -  person dan1st    schedule 12.11.2020
comment
@ dan1st Я все еще в замешательстве (я новичок в Spring). Тогда какой смысл использовать @ConfigurationProperties в первую очередь?   -  person Catalin    schedule 12.11.2020
comment
Он перезаписывает локальные переменные значениями из вашего application.properties   -  person dan1st    schedule 12.11.2020
comment
@dan1st Спасибо за ответы!   -  person Catalin    schedule 12.11.2020
comment
@Value("${storage.location:image-dir}") Попробуйте эту аннотацию   -  person Sumesh TG    schedule 12.11.2020


Ответы (2)


Spring не загружает параметры автоматически на основе имени переменной.

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

@Bean
public String location() {
    return location;
}

Если вы хотите назвать свой метод получения getLocation(), вы также можете сделать это, установив имя @Bean:

@Bean(name="location")
public String getLocation() {
    return location;
}

Если я установлю storage.location=to something else в application.properties, это сработает. Но почему тимелеаф не выбирает значение по умолчанию??

Если вы установите значение в application.propererties, Spring распознает это как свойство и использует его.

Если нет, Spring думает, что это просто геттер для чего-то другого.

person dan1st    schedule 12.11.2020
comment
Я обновил свой вопрос. Ваш ответ работает, но это не то, что я хотел. - person Catalin; 12.11.2020

Если вы измените свой класс свойств на:

@Component("fileSystemStorageProperties") // Use @Component instead of @Configuration and give the bean an explicit name
@ConfigurationProperties(prefix = "storage")
public class FileSystemStorageProperties {
    private String location = "image-dir";

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }
}

Тогда вы можете это сделать в Thymeleaf:

${@fileSystemStorageProperties.location}

См. https://www.thymeleaf.org/doc/articles/springmvcaccessdata.html#spring-beans для получения дополнительной информации.

person Wim Deblauwe    schedule 12.11.2020