Spring Загрузочное приложение: не собирает application.properties?

У меня есть приложение весенней загрузки, которое я получил здесь: https://github.com/christophstrobl/spring-data-solr-showcase/tree/4b3bbf945b182855003d5ba63a60990972a9de72

Он компилируется и отлично работает с: mvn spring-boot:run

Однако, когда я нажимаю "запустить как приложение Spring Boot" в Spring Tools Suite, я получаю сообщение о невозможности найти ${solr.host}, настроенный в файле application.properties.

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}"

Мой файл application.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). Кроме того, если я напрямую обращаюсь к IP-адресу сервера SOLR (как в закомментированном коде), приложение запускается нормально.

* 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 как встроенный сервер)

Ответ 1

Это было неясно - и другие ответы были очень полезны, когда я указал в правильном направлении.

Попробовав предлагаемые решения, я толкнул их глубже и нашел это в Project Properties → Java Build Path → Source (вкладка) → Исходные папки в пути сборки: [Секция исключения]

**/application.properties

Удаление исключения устранило проблему, и значения были взяты из файла application.properties во время запуска.

Возможно, стоит отметить, что запуск этого из командной строки (в каталоге с файлом .project) обошел проблему исключения и работал нормально.

mvn spring-boot:run

Ответ 2

Я использовал Spring Boot 2.0.0 и столкнулся с той же проблемой. С версией 1.4.3 она работала отлично.

Причина в том, что если вы определите этот аргумент:

-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

Ответ 3

Для меня это было связано с упаковкой в виде пом

У меня было что-то в моем pom.xml, как показано ниже

<packaging>pom</packaging>

Так что если у вас есть похожая вещь,

  1. Удалите его для весенне-загрузочного приложения.

  2. Удалить целевую папку или очистить mvn.

  3. тогда установите mvn.
  4. Следите за своей собственностью в файле target/classes/application.properties.

Ответ 4

Объявите свойство PropertySourcesPlaceholderConfigurer в классе @Configuration.

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {

      return new PropertySourcesPlaceholderConfigurer();
}

И ваш путь ресурса ресурса с соответствующей аннотацией.

@PropertySource("classpath:your.properties")

Ответ 5

У меня есть код для импорта свойств в 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);
}
}

При создании приложения загрузки Spring он по умолчанию считывает application.properties из папки ресурсов. Вам не нужно импортировать файл свойств.

Предположим, вы создали другой файл с другим именем или переместили файл application.properties в другую папку. В моем случае я переместил файл свойства в папку ресурсов \property, поэтому добавляю аннотацию @PropertySource для чтения этих файлов свойств.

Ответ 6

Включите следующее в ваш pom.xml. Это должно решить проблему.

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

Ответ 7

Я решил эту проблему, добавив папку ресурсов в путь сборки.

Перед

enter image description here

Сделайте следующее: -

  1. Нажмите Добавить папку...
  2. Добавить папку ресурсов

enter image description here

Ответ 8

Добавление PropertySourcesPlaceholderConfigurer и @PropertySource должно работать, если вы хотите сохранить имя файла свойств как applications.properties. Тем не менее, загрузка AFAIK spring автоматически подбирает файл application.properties. Таким образом, вы также можете переименовать свой файл applications.properties в application.properties, и он должен работать тогда.

Ответ 9

Я также столкнулся с той же проблемой, что не загружает файл application.properties в путь класса. В моем случае проблема заключалась в том, что если в вашей папке ресурсов имеется более 1 ресурса, то есть файла свойств или файлов xml, вам необходимо переименовать папку ресурс в ресурсы. Spring сделайте это автоматически для вас, но если это не произойдет, сделайте это вручную. Он решил мою проблему, может помочь вам.

Ответ 10

При создании папки src/test/resources установите флажок "Обновлять фильтры исключений в других исходных папках, чтобы разрешить вложение". А также используйте PropertySource для загрузки src

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

Ответ 11

В моем случае ресурс не был зарегистрирован как ресурс. Я использую IntelliJ, поэтому я зашел в раздел настроек модуля, выбрал папку ресурсов и затем щелкнул ресурс в верхней части окна. после этого он начал принимать файл application.properties

Ответ 12

У меня была эта проблема. Если бы я сделал "Rebuild" из IntelliJ, он скопировал бы application.properties из моей папки src/test/reources в мои target/test-classes, и все заработало бы. Но если бы я строил из Maven, он бы исчез из папки target/test-classes, а затем тесты не сработали бы при запуске maven, потому что он не мог найти файл application.properties. Низкий и вот, после долгих взад-вперед я понял, что моя папка была названа неправильно (выше не опечатка). У меня было "src/test/reources/application.properties" вместо "src/test/resources/application.properties". Какая боль, чтобы заметить это. Приведенные выше ответы помогли мне отточить его и наконец заметили опечатку. Не было так очевидно, как можно подумать. Остерегайтесь этого.