web-dev-qa-db-ja.com

Spring Bootアプリ:application.propertiesを取得していませんか?

ここで入手したスプリングブートアプリがあります: https://github.com/christophstrobl/spring-data-solr-showcase/tree/4b3bbf945b182855003d5ba63a60990972a9de72

コンパイルして正常に動作します:mvn spring-boot:run

ただし、Spring Tools Suiteで「Spring Bootアプリとして実行」をクリックすると、application.propertiesファイルに設定されている${solr.Host}が見つからないというエラーが表示されます。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.data.solr.showcase.product.ProductServiceImpl.setProductRepository(org.springframework.data.solr.showcase.product.ProductRepository); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productRepository': Initialization of bean failed; nested exception is Java.lang.IllegalArgumentException: Could not resolve placeholder 'solr.Host' in string value "${solr.Host}"

私のapplications.propertiesファイルは次のようになります。

# SPRING MVC
spring.view.suffix=.jsp
spring.view.prefix=/WEB-INF/views/

# SOLR
solr.Host=http://192.168.56.11:8983/solr

関連するクラスは次のようになります($ solr.Host変数が使用される唯一の場所)。また、(コメントされたコードのように)SOLRサーバーのIPを直接アドレス指定すると、アプリは正常に起動します。

* Copyright 2012 - 2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.Apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.data.solr.showcase.config;

import org.Apache.solr.client.solrj.SolrServer;
import org.Apache.solr.client.solrj.impl.HttpSolrServer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.repository.config.EnableSolrRepositories;
import org.springframework.data.solr.server.SolrServerFactory;
import org.springframework.data.solr.server.support.MulticoreSolrServerFactory;

/**
 * @author Christoph Strobl
 */
@Configuration
@EnableSolrRepositories(basePackages = { "org.springframework.data.solr.showcase.product" })

public class SearchContext {

    @Bean
    public SolrServer solrServer(@Value("${solr.Host}") String solrHost) {
        return new HttpSolrServer(solrHost);
    }

//  @Bean
//  public SolrServer solrServer(@Value("http://192.168.56.11:8983/solr") String solrHost) {
//      return new HttpSolrServer(solrHost);
//  }

    @Bean
    public SolrServerFactory solrServerFactory(SolrServer solrServer) {
        return new MulticoreSolrServerFactory(solrServer);
    }

    @Bean
    public SolrTemplate solrTemplate(SolrServerFactory solrServerFactory) {
        return new SolrTemplate(solrServerFactory);
    }

}

私はその「ProductRepository」(エラーで言及されたもの)を含めていますが、そこにはあまり進んでいません...

* Copyright 2012 - 2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.Apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.data.solr.showcase.product;

import Java.util.Collection;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.solr.core.query.Query.Operator;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;
import org.springframework.data.solr.showcase.product.model.Product;

/**
 * @author Christoph Strobl
 */
interface ProductRepository extends SolrCrudRepository<Product, String> {

    @Query(fields = { SearchableProductDefinition.ID_FIELD_NAME, SearchableProductDefinition.NAME_FIELD_NAME,
            SearchableProductDefinition.PRICE_FIELD_NAME, SearchableProductDefinition.FEATURES_FIELD_NAME,
            SearchableProductDefinition.AVAILABLE_FIELD_NAME }, defaultOperator = Operator.AND)
    Page<Product> findByNameIn(Collection<String> names, Pageable page);

}

「標準」ファイル構造のように見えるものがあります... src/main/Javaのコードなど。 application.propertiesファイルはsrc/main/resourcesにあります。

どんな提案もありがたいことに受け入れました。

(クイック追加:これはTomcatを組み込みサーバーとして実行しています)

16
jb62

これはあいまいでした-そして、他の答えは私が正しい方向を指し示すのに非常に役立ちました。

提案された解決策を試した後、私は深く掘り下げて、プロジェクトのプロパティでこれを見つけました-> Java Build Path-> Source(tab)-> Source folder on build path:[Exclusion section ]

**/application.properties

除外を削除すると問題が修正され、起動時にapplication.propertiesファイルから値が選択されました。

これをコマンドライン(.projectファイルがあるディレクトリ内)から実行すると、除外の問題が回避され、正常に機能したことに注意してください。

mvn spring-boot:run
48
jb62

Spring Boot2.0.0を使用しましたが、同じ問題に直面しました。バージョン1.4.3では完全に機能しました。

Reasonは、この引数を定義すると:

-Dspring.config.location=file:/app/application-prod.yml

Spring Bootはデフォルトの場所を検索に追加しません。

ソリューション

-Dspring.config.location=file:/app/application-prod.yml,classpath:application.yml

見る:

  1. /org/springframework/boot/context/config/ConfigFileApplicationListener.Java
  2. https://docs.spring.io/spring-boot/docs/2.0.1.BUILD-SNAPSHOT/reference/htmlsingle/#appendix
9

私にとってはpom

以下のようにpom.xmlに何かがありました

<packaging>pom</packaging>

あなたが同様のものを持っているのであれば、

  1. スプリングブートアプリの場合は削除します。

  2. ターゲットフォルダーまたはmvn cleanを削除します。

  3. その後、mvn install。
  4. Target/classes/application.propertiesファイルでプロパティを監視します。
5
Kundan Atre

@ConfigurationクラスでPropertySourcesPlaceholderConfigurerを宣言します。

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {

      return new PropertySourcesPlaceholderConfigurer();
}

そして、適切に注釈を付けたプロパティリソースパス。

@PropertySource("classpath:your.properties")
3
Dani

Pom.xmlに以下を含めます。これで問題が解決するはずです。

<build>
    <resources>     
        <resource>
            <directory>src/main/resources</directory>
            <includes>                      
                <include>**/*.properties</include>                  
            </includes>
        </resource>            
    </resources>
</build>
1

Springブートでプロパティをインポートするためのコードがいくつかあります。

@SpringBootApplication
@EnableIntegration
@EnableScheduling
@ImportResource({ "classpath*:applicationContext.xml" })
@PropertySources(value = {
@PropertySource(ignoreResourceNotFound = true, value =     "classpath:properties/application.properties"),
@PropertySource(ignoreResourceNotFound = true, value = "classpath:properties/dbNhibernateConfig.properties"),
@PropertySource(ignoreResourceNotFound = true, value = "classpath:properties/mailConfiguration.properties"),
@PropertySource(ignoreResourceNotFound = true, value = "classpath:properties/errorcodes.properties") })
@IntegrationComponentScan("com.*.report.main")
public class AgilereportsApplication{

public static void main(String[] args) {
    SpringApplication.run(AgilereportsApplication.class, args);
}
}

スプリングブートアプリケーションが作成されると、デフォルトでリソースフォルダーからapplication.propertiesを読み取ります。プロパティファイルをインポートする必要はありません。

別の名前で別のプロパティファイルを作成するか、application.propertiesファイルを別のフォルダーに移動したとしましょう。私の場合、プロパティファイルをresource\propertyフォルダーに移動したため、これらのプロパティファイルを読み取るために注釈@PropertySourceを追加しています。

1
user3396256

ビルドパスにリソースフォルダーを追加することでこれを解決しました。

enter image description here

以下をせよ:-

  1. [フォルダの追加...]をクリックします.
  2. リソースフォルダーを追加

enter image description here

1
Adarsh Singhal

プロパティファイル名を@PropertySourceのままにしておきたい場合は、PropertySourcesPlaceholderConfigurerapplications.propertiesを追加してください。ただし、AFAIKスプリングブートは自動的にtheapplication.propertiesファイルを取得します。そのため、applications.propertiesファイルの名前をapplication.propertiesに変更することもできます。

0
cpd214

Src/test/resourcesフォルダーの作成中に、「ネストを解決するために他のソースフォルダーの除外フィルターを更新する」チェックボックスをオンにします。また、PropertySourceを使用してsrcをロードします

@PropertySource(value = {"classpath:application-junit.properties"}, 
ignoreResourceNotFound = true)
0
Popeye

私はこの問題を抱えていました。 IntelliJから「再構築」を行うと、src/test/reourcesフォルダーからapplication.propertiesがターゲット/テストクラスにコピーされ、動作します。しかし、Mavenからビルドした場合、target/test-classesフォルダーから消え、mavenで実行するとapplication.propertiesファイルが見つからなかったためにテストが失敗します。控えめに言って、何度も行った後、フォルダの名前が間違っていることに気付きました(上記はタイプミスではありません)。 「src/test/resources/application.properties」ではなく「src/test/reources/application.properties」がありました。それを見つけるのはなんて痛い。上記の答えは、私がそれに焦点を合わせ、最終的にタイプミスに気づくのに役立ちました。考えるほど明白ではありませんでした。気をつけて。

0
G Butler

私の場合、リソースフォルダーはリソースとして登録されていません。私はIntelliJを使用しているため、モジュール設定セクションに移動し、リソースフォルダーを選択してから、ウィンドウの上部にあるリソースをクリックしました。その後、application.propertiesファイルの取得を開始しました

0

また、クラスパスにapplication.propertiesファイルをロードしないという同じ問題に直面しました。私の場合、問題は、リソースフォルダーに複数のリソース、つまりプロパティファイルまたはxmlファイルがある場合、resourceフォルダーの名前をresourcesに変更する必要があるということでした。 Springは自動的にそれを行いますが、そうでない場合は手動で行います。それは私の問題を解決し、あなたの助けになるかもしれません。

0
pawan