Spring Не удалось установить заполнитель

Я новичок в spring, поэтому извините меня, если это глупый вопрос. Когда я пытаюсь запустить программу, я получаю следующую ошибку: java.lang.IllegalArgumentException: Could not resolve placeholder 'appclient' in string value [${appclient}]. Ошибка вызывается при выполнении следующего кода:

package ca.virology.lib2.common.config.spring.properties;
import ca.virology.lib2.config.spring.PropertiesConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

@Configuration
@Import({PropertiesConfig.class})
@PropertySource("${appclient}")
public class AppClientProperties {
private static final Logger log = LoggerFactory.getLogger(AppClientProperties.class);
{
    //this initializer block will execute when an instance of this class is created by Spring
    log.info("Loading AppClientProperties");
}
@Value("${appclient.port:}")
private int appClientPort;

@Value("${appclient.host:}")
private String appClientHost;

public int getAppClientPort() {
    return appClientPort;
}

public String getAppClientHost() {
    return appClientHost;
}
}

Файл ресурсов с именем appclient.properties существует в папке ресурсов с информацией для хоста и порта. Я не уверен, где определена "${appclient}", если она вообще есть. Возможно, это даже не определено, и это вызывает проблему. Мне нужно изменить "${appclient}" на что-то вроде "{classpath:/appclient.properties}", или я пропустил что-то еще?

Ответы

Ответ 1

Вы не читаете файл свойств правильно. Свойство PropertySource должно передать параметр как: file:appclient.properties или classpath:appclient.properties. Измените аннотацию на:

@PropertySource(value={"classpath:appclient.properties"})

Однако я не знаю, что ваш файл PropertiesConfig содержит, поскольку вы также импортируете это. В идеале аннотация @PropertySource должна храниться там.

Ответ 2

Если вы используете Spring 3.1 и выше, вы можете использовать что-то вроде...

@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
  return new PropertySourcesPlaceholderConfigurer();
}
}

Вы также можете перейти к конфигурации xml, например...

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
  http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context-3.2.xsd">

  <context:property-placeholder location="classpath:foo.properties" />

  </beans>

В более ранних версиях.

Ответ 3

Мое решение состояло в том, чтобы добавить пробел между $ и {.

Например:

@Value("${appclient.port:}")

становится

@Value("$ {appclient.port:}")

Ответ 4

Для свойств, которыми нужно управлять за пределами WAR:

<context:property-placeholder location="file:///C:/application.yml"/>

Например, если внутри application.yml name и id

Затем вы можете создать bean-компонент во время выполнения внутри xml spring

<bean id="id1" class="my.class.Item">
    <property name="name" value="${name}"/>
    <property name="id" value="${id}"/>
</bean>

Ответ 5

Если ваш файл конфигурации находится в пути, отличном от пути к классу, вы можете добавить путь к файлу конфигурации в качестве системного свойства:

java -Dapp.config.path=path_to_config_file -jar your.jar

Ответ 6

Надеюсь, это будет полезно, файл application.properties (или application.yml) должен находиться в обоих путях:

  • SRC/Основные/ресурсы/конфигурации
  • SRC/тест/ресурс/конфигурации

содержащий то же свойство, на которое вы ссылаетесь