0

これが私のアプリです:

public static void main( String[] args ) {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

    //run the importer
    final ImportNewOrders importer = (ImportNewOrders) ApplicationContextProvider.getApplicationContext().getBean("importNewOrders");
    importer.run();
    //importer.runInBackground();
}

これが私の設定です:

@Configuration
@ComponentScan(basePackages = {
        "com.production"
})
@PropertySource(value = {
        "classpath:/application.properties",
        "classpath:/environment-${MY_ENVIRONMENT}.properties"
})
@EnableJpaRepositories("com.fettergroup.production.repositories")
@EnableTransactionManagement
public class Config {

    .... skipping things that aren't relevant

    @Bean
    public ImportNewOrders importNewOrders() {
        return new ImportNewOrders();
    }

これが私のクラスです...

@Component
public class ImportNewOrders implements Task {

    private final static Logger logger = Logger.getLogger(ImportNewOrders.class.getName());

    @Autowired
    private OrderService orderService;

    @Autowired
    private ImportOrderRequest importOrderRequest;

    @Value("${api.user}")
    private String apiUser;

    @Value("${api.password}")
    private String apiPassword;

    @Value("${api.orders.pingFrequency}")
    private String pingFrequency;

そして最後にapplication.properties

# ------------------- Application settings -------------------

#Base URL to the API application
api.baseUrl=http://localhost:9998

#Unique token used to authenticate this vendor
api.vendor.token=asdf

#API credentials
api.user=myuser
api.password=mypassword

#How often to check for new orders; frequency is in seconds
api.orders.pingFrequency=60

これは 1 時間か 2 時間前にはうまくいきましたが、今ではこれらの値が気に入らないと判断されました。なぜだか途方に暮れています。私にはすべてが正しいように見えます。

アップデート

@Configuration
@ComponentScan(basePackages = {
        "com.production"
})
@PropertySource(value = {
        "classpath:/application.properties",
        "classpath:/environment-${MY_ENVIRONMENT}.properties"
})
@EnableJpaRepositories("com.production.repositories")
@EnableTransactionManagement
public class Config {
    @Value("${db.url}")
    private static String PROPERTY_DATABASE_URL;

    @Bean
    public DataSource dataSource() {
        MysqlDataSource dataSource = new MysqlDataSource();

        dataSource.setUrl(PROPERTY_DATABASE_URL); //is null
        /*dataSource.setUser(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_USER));
        dataSource.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));*/

        return dataSource;
    }

    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer () {
        return new PropertySourcesPlaceholderConfigurer();
    }
}
4

1 に答える 1

6

あなたのプロパティ ファイルは、あなたによって検出され、@Configurationそのクラス内のデータベース プロパティに使用されています@PropertySource。しかし、@Valueフィールドと${}評価にはそれ以上のものが必要です。

Javadocから@PropertySource

PropertySource のプロパティを使用して、定義または @Value アノテーションの ${...} プレースホルダーを解決するには、PropertySourcesPlaceholderConfigurer を登録する必要があります。これは、XML で使用する場合は自動的に行われますが、@Configuration クラスを使用する場合は静的 @Bean メソッドを使用して明示的に登録する必要があります。詳細と例については、@Configuration Javadoc の「外部化された値の操作」セクションと、@Bean Javadoc の「BeanFactoryPostProcessor を返す @Bean メソッドに関する注意事項」を参照してください。

だから宣言する

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
    p.setLocation(new ClassPathResource("your properties path"));
    // other properties
    return p;
}

構成クラスで、または使用する場合はコメントで適切に言及されているように、完全に@PropertySource省略することができます:setLocation

@Configuration
@PropertySource(value="classpath:your_file.properties")
public class MyConfiguration{

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer()    {
        PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
    return p;
    }
}

あなたが持っているとき、あなたは環境を必要とすべきではありませんPropertySourcesPlaceholderConfigurer

ただし、ほとんどの場合、アプリケーションレベルの Bean は環境と直接対話する必要はありませんが、その代わりに、${...} プロパティ値を PropertySourcesPlaceholderConfigurer などのプロパティ プレースホルダー コンフィギュアラーに置き換える必要があります。 < context:property-placeholder/> を使用すると、Spring 3.1 の がデフォルトで登録されます。

于 2013-03-13T20:14:58.690 に答える