Не загружается файл свойств

У меня есть два проекта: CarpoolDB и Carpool.

CarpoolDB: содержит бэкэнд-материалы и имеет

carpool-application-context.xml

<context:annotation-config />
<context:component-scan base-package="com.onmobile" />
<context:property-placeholder location="classpath:server.properties" />

сервер.свойства

cm.db.driverClassName=com.mysql.jdbc.Driver
cm.db.url=jdbc:mysql://localhost:3306/carpool1
cm.db.username=abc
cm.db.password=xyz

Я делаю банку из carpoolDB и помещаю ее в приложение Carpool.

Carpool: содержит элемент пользовательского интерфейса и jar-файл carpoolDB для бэкэнда, а также имеет

carpool-приложение-context1.xml

<import resource="classpath:carpool-application-context.xml"/>
<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.authentication" />

весна-servlet.xml

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

<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.controller, com.onmobile.carpool.util" />

carpool.properties

cm.email.sender.mail.smtp.host=mail.on.com

Теперь у меня есть один класс com.onmobile.carpool.util.EmailSender, он имеет одно свойство smtpHost и хочет, чтобы Spring вводил значение с помощью @Value, но оно не вводится.

@Controller
public class EmailSender {

    public static final Log logger = LogFactory.getLog(EmailSender.class);

    @Value("${cm.email.sender.mail.smtp.host}")
    private String smtpHost;

}

Я получаю ошибку как

java.lang.IllegalArgumentException: Could not resolve placeholder 'cm.email.sender.mail.smtp.host'

carpool.properties находится в папке src.

Почему он не выбирает cm.email.sender.mail.smtp.host из файла carpool.properties. есть ли какая-либо связь с файлом свойств, присутствующим в файле jar.

На самом деле файл свойств загружается, так как я не вижу в журналах, что файл не найден, но поле не получает автосвязь.



Публикация обновленных полных файлов конфигурации после удаления импорта

веб.xml

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
            /WEB-INF/carpool-application-context1.xml
            /WEB-INF/applicationContext-security.xml
        </param-value>
  </context-param>
  <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/jsp/*</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
        </listener-class>
  </listener>

carpool-приложение-context1.xml

<!-- Configure annotated beans --> 
<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpooldb.db" />
<context:property-placeholder location="classpath:carpool.properties" />


   <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName"><beans:value>${cm.db.driverClassName}</beans:value></beans:property>
        <beans:property name="url"><beans:value>${cm.db.url}</beans:value></beans:property>
        <beans:property name="username"><beans:value>${cm.db.username}</beans:value></beans:property>
        <beans:property name="password"><beans:value>${cm.db.password}</beans:value></beans:property>
        <beans:property name="testOnBorrow"><beans:value>true</beans:value></beans:property>
        <beans:property name="testOnReturn"><beans:value>true</beans:value></beans:property>
        <beans:property name="validationQuery"><beans:value>select 1</beans:value></beans:property>
        <beans:property name="maxIdle"><beans:value>-1</beans:value></beans:property>
        <beans:property name="maxActive"><beans:value>-1</beans:value></beans:property>
        <beans:property name="maxOpenPreparedStatements"><beans:value>-1</beans:value></beans:property>
        <beans:property name="maxWait"><beans:value>30000</beans:value></beans:property>
    </beans:bean>

    //session factory bean and other configuration 

весна-servlet.xml

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

<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.authentication, com.onmobile.carpool.controller, com.onmobile.carpool.util" />


<!-- Declare a view resolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    <!-- one of the properties available; the maximum file size in bytes -->
    <property name="maxUploadSize" value="100000"/>
</bean>

carpool.properties

cm.db.driverClassName=com.mysql.jdbc.Driver
cm.db.url=jdbc:mysql://localhost:3306/carpool
cm.db.username=abc
cm.db.password=xyz

user.profile.pic.base.folder=D:\\carpoolRepository\\carpoolProfilePicUpload
google.places.autocomplete.response.xml.base.folder=D:\\carpoolRepository\\googleMapXML

#EMAIL - FORGOT PASSWORD 
cm.email.sender.mail.smtp.host=mail.on.com

Я пытаюсь ввести значение cm.email.sender.mail.smtp.host в свойстве EmailSender «smtpHost», упомянутом выше, когда я читаю его, оно говорит null. другие свойства, такие как cm.db.driverClassName и т. д., должным образом вводятся в carpool-application-context1.xml.

Я прикрепляю снимок, содержащий расположение файлов конфигурациивведите здесь описание изображения


person Jayesh    schedule 31.01.2013    source источник
comment
Вы получаете такое же исключение?   -  person Boris Treukhov    schedule 31.01.2013
comment
рассмотрите возможность публикации обновления для вопроса с фактическим файлом web.xml и файлами конфигурации   -  person Boris Treukhov    schedule 01.02.2013
comment
Спасибо за помощь Борис. Я обновил свой пост со всеми файлами конфигурации. Также я не получаю никаких исключений, но свойство smtpHost EmailSender не вводится правильным значением.   -  person Jayesh    schedule 01.02.2013


Ответы (1)


У вас есть <context:component-scan base-package="com.onmobile" /> в carpool-application-context.xml, который импортируется из carpool-application-context1.xml, поэтому ваш контроллер должен быть создан в корневом контексте веб-приложения, потому что "com.onmobile" включает "com.onmobile.carpool.controller", а для property-placeholder. /questions/11890544/spring-value-annotation-in-controller-class-not-evaluating-to-value-inside-pro/11891396#11891396">корневой контекст.

У вас есть конфигуратор заполнителя свойств в контексте сервлета (spring-servlet.xml). Настройщики заполнителей свойств (определяемые тегом context:property-placeholder) являются постпроцессорами bean-компонентов и работают на основе каждого контейнера, поэтому они не могут изменять определения bean-компонентов контекста, в котором они не определены. Таким образом, они не могут изменять определение bean-компонента объявленного экземпляра контроллера. в корневом контексте (carpool-application-context.xml, carpool-application-context1.xml). Таким образом, из-за двойного сканирования ваш контроллер создается дважды - как в корневом контексте, так и в контексте сервлета, и только один обрабатывается правильным конфигуратором-заполнителем.

В качестве исправления вы можете использовать выражения фильтра в компонентном сканировании, чтобы подобрать @Controller аннотированные классы только в spring-servlet.xml и исключить их из carpool-application-context.xml/carpool-application-context1.xml

См. @Service создаются дважды для примеров фильтров.

Пожалуйста, держите вашу конфигурацию Spring простой, ваша конфигурация очень загадочна.

update вы путаете контроллеры (которые помечены @Controller и, я думаю, их лучше поместить в пакет aaa.bbb.controllers) со службами, которые должны быть помечены @Service в пакете util. Мой совет — переместить ваши сервисы в контекст корневого веб-приложения (carpool-application-context1.xml) и поместить туда объявление конфигуратора заполнителя свойств.

person Boris Treukhov    schedule 31.01.2013
comment
Пожалуйста, сделайте вашу конфигурацию Spring простой, ваша конфигурация очень загадочна. +1 к этому. - person ach; 31.01.2013
comment
Привет, Борис, спасибо за объяснение и указание на ссылки, которые помогли решить проблему, но все же я не очень понимаю. не могли бы вы уточнить свой первый абзац... пожалуйста, это будет очень полезно... спасибо - person Jayesh; 31.01.2013
comment
Похоже тег проглотил уценка, исправлю, когда доберусь до ПК. Проблема в том, что первый файл конфигурации сканирует com.onmobile и включает класс вашего контроллера с аннотацией значения. Конфигуратор не определен в корневом контексте (который обрабатывает файлы appcontext и appcontext1), ситуация аналогична первой ссылке ответа. Нет конфигуратора-заполнителя в корневом контексте, конфигуратор в контексте сервлета ничего не может сделать с контроллером, ошибочно созданным в корневом контексте, потому что постпроцессоры работают на основе контекста приложения. - person Boris Treukhov; 31.01.2013
comment
Привет, Борис, очень признателен за ваш быстрый ответ. Я реструктурировал свое приложение, и теперь у меня есть только carpool-application-context1.xml с данными ‹context:annotation-config /› ‹context:component-scan base-package=com.onmobile .carpooldb.db /› ‹context:property-placeholder location=classpath:carpool.properties /› и spring-servlet.xml с данными ‹context:property-placeholder location=classpath:carpool.properties /›‹context:annotation-config /› ‹context:component-scan base-package=com.onmobile.carpool.authentication,com.onmobile.carpool.controller, com.onmobile.carpool.util/› - person Jayesh; 31.01.2013
comment
все же я столкнулся с проблемой, когда @Value не работает. что я должен сделать, чтобы заставить его работать. - person Jayesh; 31.01.2013
comment
Вам нужно иметь конфигуратор заполнителя свойств в том же контексте приложения, где объявлен контроллер. - person Boris Treukhov; 31.01.2013
comment
Вы уверены, что carpool-application-context.xml не в игре? - person Boris Treukhov; 31.01.2013