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

посмотреть:

  1. / org/springframework/boot/context/config / ConfigFileApplicationListener.java
  2. 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, поэтому я пошел в раздел "Настройки модуля", выбрал папку "ресурсы", а затем нажал "ресурс" в верхней части окна. он начал принимать заявление.файл свойств после этого