2016-09-08 11 views
0

プロパティファイルを使用して同じ名前の複数のBeanを作成する必要があります。たとえば:春 - 動的にapplication.propertiesからBeanを作成する

rabbit.example.language[0]=java 
rabbit.example.framework[0]=spring 
rabbit.example.language[1]=python 
rabbit.example.framework[1]=django 

私は(これは最終的にはウサギのキューに使用されますが、私は物事を単純化しています)各例インデックスにBeanを作成したいと思います。ここまで私が作業しているコードがいくつかあります。

Rabbits.java

@Configuration 
@ConfigurationProperties(prefix="example") 
public class Rabbits { 
    private String language; 
    private String framework; 

    public String getLanguage() { 
     return language; 
    } 

    public void setLanguage(String language) { 
     this.language= language; 
    } 

    public String getFramework() { 
     return framework; 
    } 

    public void setFramework(String framework) { 
     this.framework= framework; 
    } 
} 

Properties.java

@Configuration 
@ConfigurationProperties(prefix = "rabbit") 
public class Properties { 

    @NestedConfigurationProperty 
    private List<Rabbits> rabbits = new ArrayList<Rabbits>(); 

    public List<Rabbits> getRabbits() { 
     return rabbits; 
    } 

    public void setRabbits(List<Rabbits> rabbits) { 
     this.rabbits = rabbits; 
    } 

    @Bean 
    RabbitFlowProcessor rabbitFlowProcessor(List<Rabbits> rabbit){ 
     return new RabbitFlowProcessor(rabbit); 
    } 

} 

RabbitFlowProcessor.java:

@Component 
public class RabbitFlowProcessor implements BeanFactoryPostProcessor { 

    private List<Rabbits> rabbits; 

    public RabbitFlowProcessor(List<Rabbits> rabbits) { 
     this.rabbits = rabbits; 
    } 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     rabbits.stream() 
       .forEach(rabbit -> { 
        System.out.println(rabbit.getLanguage()); 
       }); 
    } 
} 

私は、出力はJavaのPythonのことを期待しますが、「ウサギよ"ヌルとして戻ってくる。誰かが私が間違っていることを伝えることができますか?一例として、

rabbit.example[0].language=java 
rabbit.example[0].framework=spring 
rabbit.example[1].language=python 
rabbit.example[1].framework=django 

が一覧になりますので、あなたはそれでインデックスを追加する必要があります。

答えて

1

以下のコメントをあなたのコードを更新してください。それは、ネストされたタイプであるかのようConfigurationPropertiesオブジェクト内のフィールドが処理されるべきであることを示すNestedConfigurationProperty annoation約


@Configuration 
@ConfigurationProperties(prefix = "rabbit") 
public class RabbitsProperties { 

    private List<Rabbits> example = new ArrayList<Rabbits>(); 

    public List<Rabbits> getExample() { 
     return example; 
    } 

    public void setExample(List<Rabbits> example) { 
     this.example = example; 
    } 
} 

。 この注釈は実際のバインディングプロセスに関係しませんが、フィールドが単一の値としてバインドされていないというヒントとしてspring-boot-configuration-processorによって使用されています。


public class Rabbits { 
    private String language; 
    private String framework; 

    public String getLanguage() { 
     return language; 
    } 

    public void setLanguage(String language) { 
     this.language= language; 
    } 

    public String getFramework() { 
     return framework; 
    } 

    public void setFramework(String framework) { 
     this.framework= framework; 
    } 
} 

一般的に、あなたは通常通りRabbitsPropertiesを注入することができ、あなたのRabbitFlowProcessor.javaに続いてRabbitsProperties

に、ネストされた内部クラスとしてこれを追加することができます。

@Component 
public class RabbitFlowProcessor implements BeanFactoryPostProcessor { 

    @Autowired 
    private RabbitsProperties rabbitsProperties; 
    ...... 
} 
関連する問題