ここで入手したスプリングブートアプリがあります: 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を組み込みサーバーとして実行しています)
これはあいまいでした-そして、他の答えは私が正しい方向を指し示すのに非常に役立ちました。
提案された解決策を試した後、私は深く掘り下げて、プロジェクトのプロパティでこれを見つけました-> Java Build Path-> Source(tab)-> Source folder on build path:[Exclusion section ]
**/application.properties
除外を削除すると問題が修正され、起動時にapplication.propertiesファイルから値が選択されました。
これをコマンドライン(.projectファイルがあるディレクトリ内)から実行すると、除外の問題が回避され、正常に機能したことに注意してください。
mvn spring-boot:run
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
見る:
私にとってはpom
以下のようにpom.xmlに何かがありました
<packaging>pom</packaging>
あなたが同様のものを持っているのであれば、
スプリングブートアプリの場合は削除します。
ターゲットフォルダーまたはmvn cleanを削除します。
@ConfigurationクラスでPropertySourcesPlaceholderConfigurerを宣言します。
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
そして、適切に注釈を付けたプロパティリソースパス。
@PropertySource("classpath:your.properties")
Pom.xmlに以下を含めます。これで問題が解決するはずです。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
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
を追加しています。
プロパティファイル名を@PropertySource
のままにしておきたい場合は、PropertySourcesPlaceholderConfigurer
とapplications.properties
を追加してください。ただし、AFAIKスプリングブートは自動的にtheapplication.properties
ファイルを取得します。そのため、applications.properties
ファイルの名前をapplication.properties
に変更することもできます。
Src/test/resourcesフォルダーの作成中に、「ネストを解決するために他のソースフォルダーの除外フィルターを更新する」チェックボックスをオンにします。また、PropertySourceを使用してsrcをロードします
@PropertySource(value = {"classpath:application-junit.properties"},
ignoreResourceNotFound = true)
私はこの問題を抱えていました。 IntelliJから「再構築」を行うと、src/test/reourcesフォルダーからapplication.propertiesがターゲット/テストクラスにコピーされ、動作します。しかし、Mavenからビルドした場合、target/test-classesフォルダーから消え、mavenで実行するとapplication.propertiesファイルが見つからなかったためにテストが失敗します。控えめに言って、何度も行った後、フォルダの名前が間違っていることに気付きました(上記はタイプミスではありません)。 「src/test/resources/application.properties」ではなく「src/test/reources/application.properties」がありました。それを見つけるのはなんて痛い。上記の答えは、私がそれに焦点を合わせ、最終的にタイプミスに気づくのに役立ちました。考えるほど明白ではありませんでした。気をつけて。
私の場合、リソースフォルダーはリソースとして登録されていません。私はIntelliJを使用しているため、モジュール設定セクションに移動し、リソースフォルダーを選択してから、ウィンドウの上部にあるリソースをクリックしました。その後、application.propertiesファイルの取得を開始しました
また、クラスパスにapplication.propertiesファイルをロードしないという同じ問題に直面しました。私の場合、問題は、リソースフォルダーに複数のリソース、つまりプロパティファイルまたはxmlファイルがある場合、resourceフォルダーの名前をresourcesに変更する必要があるということでした。 Springは自動的にそれを行いますが、そうでない場合は手動で行います。それは私の問題を解決し、あなたの助けになるかもしれません。