Ich habe eine Spring Boot App, die ich hier habe: https://github.com/christophstrobl/spring-data-solr-showcase/tree/4b3bbf945b182855003d5ba63a60990972a9de72
Es kompiliert und funktioniert gut mit: mvn spring-boot:run
Wenn ich jedoch in Spring Tools Suite auf "Als Spring Boot-App ausführen" klicke, wird die Fehlermeldung angezeigt, dass ${solr.Host}
nicht gefunden werden kann, der in der Datei "application.properties" festgelegt ist.
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}"
Meine Datei applications.properties sieht folgendermaßen aus:
# SPRING MVC
spring.view.suffix=.jsp
spring.view.prefix=/WEB-INF/views/
# SOLR
solr.Host=http://192.168.56.11:8983/solr
Die relevante Klasse sieht so aus (der einzige Ort, an dem die Variable $ solr.Host verwendet wird). Wenn ich die IP-Adresse des SOLR-Servers (wie im kommentierten Code) direkt anspreche, wird die App problemlos gestartet.
* 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);
}
}
Ich füge das "ProductRepository" - das im Fehler erwähnte - bei, obwohl dort nicht viel los ist ...
* 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);
}
Ich habe eine scheinbar "standardmäßige" Dateistruktur ... Code in src/main/Java und so weiter. Die Datei application.properties befindet sich in src/main/resources.
Anregungen wurden dankend angenommen.
(Kurzer Zusatz: Hier wird Tomcat als eingebetteter Server ausgeführt.)
Das war dunkel, und die anderen Antworten waren sehr hilfreich, um mich in die richtige Richtung zu bringen.
Nachdem ich die vorgeschlagenen Lösungen ausprobiert hatte, ging ich tiefer in das Projekt und fand es unter Projekteigenschaften -> Java-Erstellungspfad -> Quelle (Registerkarte) -> Quellordner im Erstellungspfad:
**/application.properties
Durch das Entfernen des Ausschlusses wurde das Problem behoben, und die Werte wurden beim Start aus der Datei application.properties abgerufen.
Es kann erwähnenswert sein, dass die Ausführung dieses Befehls über die Befehlszeile (im Verzeichnis mit der Projektdatei) das Ausschlussproblem umgangen hat und gut funktioniert hat.
mvn spring-boot:run
Ich habe Spring Boot 2.0.0 verwendet und hatte das gleiche Problem. Mit der Version 1.4.3 hat es einwandfrei funktioniert.
Grund ist, dass, wenn Sie dieses Argument definieren:
-Dspring.config.location=file:/app/application-prod.yml
Spring Boot fügt jetzt keine Standardspeicherorte zur Suche hinzu.
Lösung :
-Dspring.config.location=file:/app/application-prod.yml,classpath:application.yml
Sehen:
Deklarieren Sie den PropertySourcesPlaceholderConfigurer in Ihrer @Configuration-Klasse.
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
Und Ihren Eigenschaftsressourcenpfad mit der richtigen Anmerkung.
@PropertySource("classpath:your.properties")
Fügen Sie Folgendes in Ihre pom.xml ..__ ein. Dies sollte das Problem beheben.
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
Ich habe etwas Code zum Importieren von Eigenschaften in Spring Boot:
@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);
}
}
Wenn eine Spring Boot-Anwendung erstellt wird, liest sie standardmäßig application.properties
aus dem Ressourcenordner. Sie müssen keine Eigenschaftendatei importieren.
Angenommen, Sie erstellen eine andere Eigenschaftsdatei mit einem anderen Namen oder Sie haben die application.properties
-Datei in einen anderen Ordner verschoben. In meinem Fall habe ich die Eigenschaftsdatei in den Ordner resource\property verschoben, sodass ich die Annotation @PropertySource
zum Lesen dieser Eigenschaftendateien hinzufüge.
Für mich lag es an der Verpackung als pom
Ich hatte etwas in meiner pom.xml als unten
<packaging>pom</packaging>
Wenn Sie also eine ähnliche Sache haben,
Entfernen Sie es für die Spring-Boot-App.
Zielordner löschen oder MVN Clean löschen.
Das Hinzufügen von PropertySourcesPlaceholderConfigurer
und @PropertySource
sollte funktionieren, falls Sie den Namen der Eigenschaftendatei als applications.properties
beibehalten möchten. AFAIK Spring Boot nimmt jedoch automatisch die application.properties
-Datei auf. Sie können Ihre applications.properties
-Datei auch in application.properties
umbenennen und dann sollte es funktionieren.
Aktivieren Sie beim Erstellen des Ordners src/test/resources das Kontrollkästchen "Ausschlussfilter in anderen Quellordnern aktualisieren, um die Verschachtelung zu lösen". Und auch die PropertySource verwenden, um die SRC zu laden
@PropertySource(value = {"classpath:application-junit.properties"},
ignoreResourceNotFound = true)
Ich hatte dieses Problem. Wenn ich ein "Rebuild" von IntelliJ ausführen würde, würde es die application.properties aus meinem src/test/reources-Ordner in meine target/test-Klassen kopieren und es würde funktionieren. Wenn ich jedoch von Maven aus erstellte, verschwand es aus dem Ordner target/test-classes und die Tests schlugen fehl, wenn sie von Maven ausgeführt wurden, da die Datei application.properties nicht gefunden wurde. Niedrig und siehe da, nach langem Hin und Her wurde mir klar, dass mein Ordner falsch benannt war (oben ist kein Tippfehler). Ich hatte "src/test/reources/application.properties" anstelle von "src/test/resources/application.properties". Was für ein Schmerz, das zu erkennen. Die obigen Antworten haben mir geholfen, mich darauf einzulassen und endlich den Tippfehler zu bemerken. War nicht so offensichtlich, wie man denken könnte. Achten Sie darauf.
In meinem Fall wurde der Ressourcen-Foulder nicht als Ressource registriert. Ich benutze IntelliJ, also bin ich zu den Moduleinstellungen gegangen, habe den Ressourcenordner ausgewählt und dann im oberen Bereich des Fensters auf Ressource geklickt. Danach begann die Datei application.properties
Ich hatte auch das gleiche Problem, dass es nicht die Datei application.properties im Klassenpfad lädt. In meinem Fall bestand das Problem darin, dass Sie, wenn Sie in Ihrem Ressourcenordner mehr als eine Ressource haben, d. H. Eigenschaftendatei oder XML-Dateien, den Ordner resource in resources umbenennen müssen. Spring erledigt es automatisch für Sie, aber wenn es nicht geschieht, tun Sie es manuell. Es hat mein Problem gelöst, könnte Ihnen helfen.