Конфигурация Spring Bean (Mis-) - PullRequest
2 голосов
/ 17 октября 2011

Я новичок в Spring и пытаюсь выполнить две задачи:

  1. Я хочу сохранить данные конфигурации моего приложения (IP-адреса сервера, учетные данные и т. Д.) В файле свойств, специфичном для развертывания.(`environment.properties`)
  2. Я хочу использовать Spring для внедрения зависимостей этих данных конфигурации в мое приложение

Итак, сначала у нас есть файл environment.properties:

ftpServer=http://example.com/ftp
ftpUser=exampleUser
ftpPassword=examplePassword

Следующий мой конфигурационный файл Spring, который содержит propertyConfigurer бин, который я считаю Я правильно настроил:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="placeholderPrefix" value="${" />
    <property name="placeholderSuffix" value="}" />
    <property name="locations">         
        <value>classpath:environment.properties</value>     
    </property> 
</bean>

<bean id="ftpServer" class="java.lang.String">
    <constructor-arg type="java.lang.String" value="${ftpServer}"/>
</bean>

<bean id="ftpUser" class="java.lang.String">
    <constructor-arg type="java.lang.String" value="${ftpUser}"/>
    <constructor-arg></constructor-arg>
</bean>

<bean id="ftpPassword" class="java.lang.String">
    <constructor-arg type="java.lang.String" value="${ftpPassword}"/>
</bean>

И, наконец, исходный код, где яхочу, чтобы эти специфичные для развертывания данные были введены в:

public void connectToServerAndDoSomething()
{
    String strServer = oAppContext.getBean("ftpServer");
    String strUser = oAppContext.getBean("ftpUser");
    String strPassword = oAppContext.getBean("ftpPassword");

    FTPClient oFTP = new FTPClient(strServer, strUser, strPassword);
}

Мой вопрос :

В моем файле конфигурации появляется ошибка проверки bean-компонента Spring:

SEVERE: Exception sending context initialized event to listener instance of class     
org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.parsing.BeanDefinitionParsingException:   
Configuration problem: Unexpected failure during bean definition parsing
Offending resource: ServletContext resource [/WEB-INF/app-config.xml] Bean 'ftpUser'; nested exception is 
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: 
Configuration problem: <constructor-arg> element must specify a ref or value
Offending resource: ServletContext resource [/WEB-INF/app-config.xml] Bean 'ftpUser' -> Constructor-arg

Поскольку я новичок в Spring, я не знаю с чего начать.Разве нельзя использовать Spring для внедрения типов Java, таких как String s, или нельзя использовать Spring таким, какой я есть?В любом случае, чтобы обойти это?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Фактическая ошибка, которую вы получаете из-за наличия пустого элемента constructor-arg для bean-компонента ftpUser. Удалить дубликат

<constructor-arg></constructor-arg>

Я также думаю, что вы делаете это немного неправильно. Типичным способом было бы определить bean-компонент для FTPClient следующим образом:

<bean id="ftpClient" class="your.package.FTPClient">
   <constructor-arg value="${ftpServer}" />
   <constructor-arg value="${ftpUser}" />
   <constructor-arg value="${ftpPassword}" />
</bean>
1 голос
/ 17 октября 2011

Проблема в том, что на самом деле ничего не значит. Spring имеет 3 способа определения

  1. Использование атрибута ref для ссылки на другой компонент
  2. Использование значения - передача простого значения. Обратите внимание, что Spring поставляется с пакетом конвертеров, которые могут преобразовывать строки в числа / логические значения и т. Д. *
  3. Использование вложенного тега bean или просто передача значения. В вашем случае вы не передаете значение вообще. Вы можете изменить его на:

и все будет хорошо

0 голосов
/ 17 октября 2011

Здесь несколько вопросов:

  • <constructor-arg> element must specify a ref or value это связано с тем, что в вашем определении бина есть тэг emptu constructor-arg. Файл xml просто отключается schma, так как этот тег должен иметь атрибут «value» или «ref»:

Удалить 2-й тег constructor-arg.

  • чтобы иметь возможность параметризации в файле .properties, вы просто создаете этот файл и добавляете в него свойства / значения, затем в контексте Spring вы делаете ссылку на этот файл, например, и затем используете $ { propertyName} заполнитель, чтобы получить значение определенного свойства в вашем файле XML-бинов:

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
          <value>classpath:my.properties</value>
      </list>
    </property>
    

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...