0

war ファイル (project-web.war) によって参照される jar (project.service.jar) 内にある db.properties をロードできませんでした。出力 war には、WEB-INF/lib/project.service.jar 内に jar があります。サービス jar には、Web アプリで使用されるサービスと dao クラスが含まれています。jar は、jar のサービスの一部を使用するレスト ウォーでも使用されます。戦争が始まると、サービスの jar ファイルにある db.properties をロードできませんでした。prop ファイルには、jndi で検索するためのデータソース名が含まれています。

戦争設定

AppConfig.java

@Bean
public static PropertyPlaceholderConfigurer propertyConfigurer()
        throws IOException {
    PropertyPlaceholderConfigurer props = new PropertyPlaceholderConfigurer();
    props.setLocations(new Resource[] { new ClassPathResource(
            "application.properties") });
    return props;
}

service.jar

@Component
@Configuration
//@ComponentScan(basePackages={ "com.mgage.mvoice" })
@PropertySource(value = { "classpath:db.properties" })
public class DatabaseConfig {
    @Autowired
    Environment environment;

    private @Value(value = "${voice.datasource}") String dataSourceString;

    @Bean
public DataSource getDataSource() {
    JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    try {
        DataSource dataSource = lookup.getDataSource(dataSourceString); //this always is null
        return dataSource;
    } catch (DataSourceLookupFailureException e) {
        return null;
    }
}

    @Bean
    public PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

AppConfig.java が DataSourceConfig.java をインポートする必要があります。試してみましたが、それでも環境が null になります。何か不足していますか?サービスを jar ファイルとして分離して、REST、Web アプリケーション、およびレポート アプリケーションで使用できるようにすることは正しいですか? それとも、すべてのサービス、休息、レポートのクラスで単一の戦争を行うことをお勧めしますか?

4

2 に答える 2

0

私の知る限り、春のアプリケーションコンテキストは 1 つだけを使用しますPropertySourcesPlaceholderConfigurer。環境にデータが入力されて@PropertySource(value = { "classpath:db.properties" })いないように見えるため、他の解決策は 1 つしかありません: の場所のリストに明示的に追加しますAppConfig.java

    props.setLocations(new Resource[] { new ClassPathResource(
        "application.properties"), new ClassPathResource("db.properties")});

しかし、これはきれいな解決策というよりも回避策であることを認めなければなりません。

編集 :

ただし、通常は、DataSourceConfig.javaスプリング構成機構によってスキャンされ@PropertySource(value = { "classpath:db.properties" })、環境にデータを入力する必要があります。

于 2014-08-12T08:56:13.833 に答える