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
см.:
- /org/springframework/boot/context/config/ConfigFileApplicationListener.java
- https://docs.spring.io/spring-boot/docs/2.0.1.BUILD-SNAPSHOT/reference/htmlsingle/#appendix
Ответ 3
Для меня это было связано с упаковкой в виде пом
У меня было что-то в моем pom.xml, как показано ниже
<packaging>pom</packaging>
Так что если у вас есть похожая вещь,
Удалите его для весенне-загрузочного приложения.
Удалить целевую папку или очистить mvn.
- тогда установите mvn.
- Следите за своей собственностью в файле 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]()
Сделайте следующее: -
- Нажмите Добавить папку...
- Добавить папку ресурсов
![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". Какая боль, чтобы заметить это. Приведенные выше ответы помогли мне отточить его и наконец заметили опечатку. Не было так очевидно, как можно подумать. Остерегайтесь этого.