Spring Boot app: не подбирая приложение.свойства?
у меня весна загрузки приложения у меня здесь: https://github.com/christophstrobl/spring-data-solr-showcase/tree/4b3bbf945b182855003d5ba63a60990972a9de72
он компилируется и отлично работает с:mvn spring-boot:run
однако, когда я нажимаю "запустить как приложение Spring Boot" в Spring Tools Suite, я получаю сообщение об ошибке о невозможности найти ${solr.host}
, который находится в приложении.файл свойств.
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}"
Мои приложения.файл свойств выглядит так это:
# 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 и так далее. Этот приложение.файл свойств находится в src / main / resources.
любые предложения с благодарностью принимаются.
(быстрое добавление: это работает Tomcat в качестве встроенного сервера)
9 ответов
Это было неясно - и другие ответы были очень полезны, чтобы указать мне в правильном направлении.
попробовав предлагаемые решения, я порылся глубже и нашел это в свойствах проекта --> Путь сборки Java --> источник (вкладка) -- > исходные папки на пути сборки: [раздел исключения]
**/application.properties
удаление исключения Исправлена проблема, и значения были подобраны из приложения.файл свойств во время запуска.
Это может быть стоит отметить, что для запуска из командной строки (в каталоге .project file) обошел проблему исключения и работал нормально.
mvn spring-boot:run
объявите PropertySourcesPlaceholderConfigurer в своем классе @Configuration.
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
и путь к ресурсу вашего свойства с правильной аннотацией.
@PropertySource("classpath:your.properties")
Я Весна Загрузки 2.0.0 и я столкнулся с той же проблемой. С версией 1.4.3 он работал отлично.
причина это если вы определяете этот аргумент:
-Dspring.config.location=file:/app/application-prod.yml
Весна Загрузки теперь не добавляет местоположения по умолчанию для поиска.
решение:
-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
добавлять PropertySourcesPlaceholderConfigurer
и @PropertySource
должен работать, если вы хотите сохранить имя файла свойств как applications.properties
. Тем не менее, AFAIK spring boot автоматически подбирает. Таким образом, вы также можете переименовать свой до application.properties
и тогда это должно сработать.
Я также столкнулся с той же проблемой, что и при загрузке приложения.файл свойств в пути к классу. В моем случае проблема заключалась в том, что если в вашей папке ресурсов у вас есть более 1 ресурсов, т. е. файл свойств или xml-файлы, вам нужно переименовать ресурс до ресурсы. Весна делает это автоматически для вас, но если это не происходит, сделайте это вручную. Это решило мою проблему, может помочь твоей.
у меня есть код для импорта свойств в 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 boot он читает application.properties
из папки ресурсов по умолчанию. Вам не нужно импортировать файл свойств.
допустим, вы создаете другой файл свойств с другим именем или вы переместили application.properties
файл в другую папку. В моем случае я переместил файл свойств в ресурс\собственность папка, поэтому я добавляю аннотацию @PropertySource
читать эти файл свойств.
при создании папки src/test/resources установите флажок "обновить фильтры исключений в других исходных папках для решения вложенности". А также используйте PropertySource для загрузки src
@PropertySource(value = {"classpath:application-junit.properties"},
ignoreResourceNotFound = true)
включите в pom следующее.XML. Это должно устранить проблему.
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
в моем случае ресурс foulder не был зарегистрирован как ресурс. Я использую IntelliJ, поэтому я пошел в раздел "Настройки модуля", выбрал папку "ресурсы", а затем нажал "ресурс" в верхней части окна. он начал принимать заявление.файл свойств после этого