webentwicklung-frage-antwort-db.com.de

Spring Boot-App: Anwendungseigenschaften nicht abholen?

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.)

9
jb62

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
36
jb62

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:

  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

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")
2
Dani

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>
1

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.

1
user3396256

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,

  1. Entfernen Sie es für die Spring-Boot-App.

  2. Zielordner löschen oder MVN Clean löschen. 

  3. dann mvn installieren.
  4. Beobachten Sie Ihre Eigenschaft in der Datei target/classes/application.properties.
1
Kundan Atre

Ich habe dieses Problem gelöst, indem ich den Ressourcenordner im Erstellungspfad hinzugefügt habe.

Vor

enter image description here

Mach Folgendes:-

  1. Klicken Sie auf Ordner hinzufügen ...
  2. Ressourcenordner hinzufügen

enter image description here

1
Adarsh Singhal

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.

0
cpd214

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)
0
Popeye

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.

0
G Butler

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

0

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.

0
pawan