Spring 2.0.0-RELEASE ConfigurationProperties привязка не работает - PullRequest
0 голосов
/ 10 мая 2018

Этот сценарий был в порядке в 1.5.3.RELEASE.

У меня есть внешний файл свойств external.yml, он выглядит так

app:
  datasources:
    - name: sourceOne
      driver: xxx
      url: some_url
      username: u1
      password: p1
    - name: sourceTwo
      driver: xxx
      url: some_url2
      username: u2
      password: p2

я добавил @EnableConfigurationProperties({DatabaseProperties.class})

Класс выглядит следующим образом:

@Component
@PropertySource("classpath:database.yml")
@ConfigurationProperties(prefix = "app") // prefix app, find app.* values
public class DatabaseProperties {
private List<DataSourceFromProperties> datasources;
// getter and setters

, когда я запускаю приложение, была выдана эта ошибка:

    Failed to bind properties under 'app' to ...DatabaseProperties:

        Property: app
        Value: 
        Origin: "app" from property source "class path resource [database.yml]"
        Reason: No converter found capable of converting from type [java.lang.String] to type [@org.springframework.boot.context.properties.ConfigurationProperties ...DatabaseProperties]

    Action:

Update your application's configuration

похоже, что привязка изменена в 2.0.0-RELEASE

Есть идеи, что мне обновить / изменить в этом сценарии?

вот файл pom

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.156</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-envers</artifactId>
            <version>5.2.6.Final</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.12</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-csv</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

@PropertySource не поддерживает файлы YAML из коробки.

Мартен Дейнум действительно отличная статья , демонстрирующая, как добавить поддержку YAML. Вот сокращенная версия его примера для краткости:

public class YamlPropertySourceFactory implements PropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) {
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        factory.setResources(resource.getResource());
        factory.afterPropertiesSet();
        Properties propertiesFromYaml = factory.getObject();
        return new PropertiesPropertySource(name, propertiesFromYaml);
    }

}

Обратитесь к его статье за ​​более полным примером кода.

0 голосов
/ 04 июля 2018

Решено это следующим образом:

  1. PropertyScource предназначен только для файлов .properties, поэтому я изменяю .yml на .properties

    app.datasources [0] .name= aaa app.datasources [0] .driver = aaa app.datasources [0] .url = aaa app.datasources [0] .username = aaa app.datasources [0] .password = aaa

    app.источники данных [1] .name = bbb app.datasources [1] .driver = bbb app.datasources [1] .url = bbb app.datasources [1] .username = bbb app.datasources [1] .password = bbb

Проблема была в DatabaseProperties

внутренний класс ДОЛЖЕН быть статическим

public class  DatabaseProperties{
private List<InnerClass> datasources;
public List<InnerClass> getDatasources() {
        return datasources;
}
.
.
.
static class InnerClass{}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...