使用不同的前缀和相同的值时,ConfigurationProperties不起作用

时间:2019-12-16 07:56:19

标签: java spring

我有以下yaml属性文件:

myPrefix: 
  value: Hello
myPrefix2:
  value: World

还有两个班级

@PropertySource("classpath:permission-config.yml")
@ConfigurationProperties(prefix = "myPrefix")
@Component
@Getter
@Setter
public class ViewUsers {
    private String value;
}

@PropertySource("classpath:permission-config.yml")
@ConfigurationProperties(prefix = "myPrefix2")
@Component
@Getter
@Setter
public class ManageUsers {
    private String value;
}

然后 null 被注入。 或者,如果我尝试使用@Value,则仅检索最新的值,这是最后一个(世界),始终忽略前面的值。

1 个答案:

答案 0 :(得分:2)

尝试以下方法:

  1. 从配置属性(@ComponentViewUsers)中删除ManageUsers
  2. 相反,请使用以下构造:
@PropertySource("classpath:permission-config.yml")
@ConfigurationProperties(prefix = "myPrefix")
public class ViewUsers {
    private String value; // getter, setter
}

@PropertySource("classpath:permission-config.yml")
@ConfigurationProperties(prefix = "myPrefix2")
public class ManageUsers {
    private String value; // getter, setter
}

@Configuration
@EnableConfigurationProperties({ViewUsers.class, ManageUsers.class}
public class MySampleConfiguration {

    ... beans here...
}

还要确保Lombok注释能够按预期工作(尝试仅在POC中使用不带Lombok的注释)。

更新1

为@M。 Deinum友好地表示,像这样的PropertySource不适用于yaml文件。

您可以尝试以下解决方法:

@Configuration
@PropertySource(name = "someName", value = "classpath:foo.yaml", factory = YamlPropertySourceFactory.class)
public class MyConfig {
}


import org.springframework.boot.env.YamlPropertySourceLoader;
public class YamlPropertySourceFactory implements PropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        final List<PropertySource<?>> load = new YamlPropertySourceLoader().load(name, resource.getResource());
        return load.get(0);
    }
}