Spring Boot-App: Nimmt application.properties nicht auf?

Lesezeit: 7 Minuten

Ich habe eine Spring Boot App, die ich hier bekommen 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 der Spring Tools Suite auf „Als Spring Boot-App ausführen“ klicke, erhalte ich eine Fehlermeldung, dass ich sie nicht finden kann ${solr.host} die in der Datei application.properties eingerichtet wird.

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 so 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 (die einzige Stelle, an der die Variable $solr.host verwendet wird). Auch wenn ich die IP des SOLR-Servers direkt adressiere (wie im kommentierten Code), startet die App einwandfrei.

* 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 dieses “ProductRepository” hinzu – das im Fehler erwähnte – 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 etwas, das wie eine “Standard” -Dateistruktur aussieht … Code in src/main/java und so weiter. Die Datei application.properties befindet sich in src/main/resources.

Alle Vorschläge dankbar angenommen.

(Schnelle Ergänzung: Dies führt Tomcat als eingebetteten Server aus)

Das war unklar – und die anderen Antworten waren sehr hilfreich, um mich in die richtige Richtung zu lenken.

Nachdem ich die vorgeschlagenen Lösungen ausprobiert hatte, stocherte ich tiefer herum und fand dies in Projekteigenschaften –> Java-Erstellungspfad –> Quelle (Registerkarte) –> Quellordner im Erstellungspfad: [Exclusion section]

**/application.properties

Durch das Entfernen des Ausschlusses wurde das Problem behoben und die Werte wurden während des Starts aus der Datei „application.properties“ übernommen.

Es kann erwähnenswert sein, dass die Ausführung über die Befehlszeile (im Verzeichnis mit der .project-Datei) das Ausschlussproblem umgangen hat und gut funktioniert hat.

mvn spring-boot:run

  • Vielen Dank, dass Sie dies weiterverfolgt haben. Ich hatte das gleiche Problem und habe an der falschen Stelle gesucht.

    – Punit Raizada

    29. August 2016 um 16:53 Uhr

  • Wirklich schöner Fund. Vielen Dank

    – Pulkit Gupta

    7. Juli 2017 um 9:15 Uhr

  • Ich hatte das gleiche Problem. Habe Eclipse Neon unter Windows 8 und Eclipse Oxygen unter Linux ausgeführt. Dasselbe Projekt (derselbe Arbeitsbereich) funktionierte früher unter Windows und nicht unter Linux. Das Entfernen des Ausschlusses im Linux-Projekt hat geholfen.

    – Visrahane

    8. Juli 2017 um 21:07 Uhr


  • Danke schön! Meinen Tag gerettet. Ich hatte src/main/resources false in pom.xml

    – Alex

    11. Oktober 2017 um 19:22 Uhr

  • src/main/resources false oder true funktioniert beides – seltsam **.*

    – Alex

    11. Oktober 2017 um 19:32 Uhr

Bei mir lag es an der Verpackung als pom

Ich hatte etwas in meiner pom.xml wie unten

<packaging>pom</packaging>

Also, wenn Sie ähnliches haben,

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

  2. Zielordner löschen oder mvn clean.

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

  • Gibt es eine Möglichkeit, POM-Verpackungen zu haben und die Lösung trotzdem in einem funktionierenden Zustand zu haben?

    – Darek

    16. Dezember 2019 um 16:11 Uhr

  • Es scheint, es ist nicht: stackoverflow.com/questions/27297308/…

    – Darek

    16. Dezember 2019 um 16:15 Uhr

  • Danke, das hat bei mir funktioniert, aber warum dies das Problem verursacht, können Sie erklären ..!

    – Tayab Hussain

    10. Januar 2020 um 20:05 Uhr

Benutzeravatar von Vova Perebykivskyi
Vova Perebykivskyi

ich benutzte Frühlingsstiefel 2.0.0 und ich stand vor dem gleichen Problem. Mit Fassung 1.4.3 es funktionierte perfekt.

Grund ist das, wenn Sie dieses Argument definieren:

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

Frühlingsstiefel now fügt keine Standardorte 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

  • Diese Antwort scheint richtig zu sein. Benutzer sollten gewarnt werden, dass die Dokumentation (in Abschnitt 76.3) Zustände (nachdem erklärt wurde, wie man überschreibt spring.config.location) “Egal was Sie in der Umgebung einstellen, Spring Boot lädt immer application.properties wie oben beschrieben.” Eine andere Option wäre die Verwendung spring.config.additional-location stattdessen.

    – Adam Batkin

    20. Januar 2019 um 2:57 Uhr

  • Das ist die richtige Antwort, hat mir gerade sehr geholfen. Danke!

    – Yanick Nedderhoff

    27. April 2020 um 16:10 Uhr

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>

Leider haben mir die genannten Ansätze nicht weitergeholfen. Hinzufügen des Ressourcenordners zu Klassenpfad hat das Problem in meinem Fall gelöst.

Schritte erledigt:

  1. Wählen Sie Ihre Frühlingsanwendung aus und öffnen Sie sie Konfigurationen ausführen
  2. wählen Klassenpfad Tab
  3. wählen Benutzereinträge
  4. klicke auf Fortschrittlich Taste
  5. Wählen Sie Ordner hinzufügen und klicken Sie auf die Schaltfläche OK
  6. wähle Deine Ressourcen Ordner (/src/main/resources) und klicken Sie auf die Schaltfläche OK

Geben Sie hier die Bildbeschreibung ein

Benutzeravatar von Adarsh ​​Singhal
Adarsh ​​Singhal

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

Vor

Geben Sie hier die Bildbeschreibung ein

Mach Folgendes:-

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

Geben Sie hier die Bildbeschreibung ein

Deklarieren Sie den PropertySourcesPlaceholderConfigurer in Ihrer @Configuration-Klasse.

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {

      return new PropertySourcesPlaceholderConfigurer();
}

Und Ihr Property-Ressourcenpfad mit der richtigen Anmerkung.

@PropertySource("classpath:your.properties")

  • Danke Dani – das hätte eindeutig funktioniert, wenn meine Situation einfach gewesen wäre. Nachdem ich dies erfolglos versucht hatte, stöberte ich weiter herum und stellte fest, dass das Verzeichnis mit application.configuration in den Projekteigenschaften –> Java-Erstellungspfad –> Quelleinstellungen (Registerkarte) des von mir heruntergeladenen Projekts explizit ausgeschlossen worden war. Sobald ich den Ausschluss herausgenommen habe, wurde die application.properties wie erwartet beim Start eingelesen.

    – jb62

    14. Oktober 2015 um 16:52 Uhr


1444330cookie-checkSpring Boot-App: Nimmt application.properties nicht auf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy