2
votes

I have Spring MVC web application on Spring 3.2.4. i have 2 context. 1. mvc-dispatcher-servlet.xml look like this :

<context:annotation-config/>
    <context:component-scan base-package="com.ja.dom"/>

    <!-- Tiles 3 config -->

    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <!--Don't add suffix or prefix like you do with .jsp files-->
        <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
    </bean>

    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer" >
        <property name="definitions">
            <value>/WEB-INF/tiles.xml</value>
        </property>
    </bean>

and 2. root-context.xml like this :

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

 <!-- Mail Sender Bean -->

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
     <property name="host" value="smtp.gmail.com" />
     <property name="port" value="587" />
     <property name="username" value="${email.name}" />
     <property name="password" value="${email.password}" />
     <property name="defaultEncoding" value="UTF-8"/>

     <property name="javaMailProperties">
         <props>
             <prop key="mail.smtp.auth">true</prop>
             <prop key="mail.smtp.starttls.enable">true</prop>
             <prop key="mail.debug">true</prop>
         </props>
     </property>
 </bean>

When i run application, i see what only mailSender bean have param from properties file. My other beans, etc @Service .. not be injected. What's wrong? How to share my PropertyPlaceholderConfigurer to mvc-dispatcher-servlet context?

I inject properties on Service like this :

@Value("${reCaptcha.private.key}") private String reCaptchaPrivateKey;

and my web.xml (UPDATE)

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <display-name>Spring MVC Application</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--<init-param>-->
            <!--<param-name>contextConfigLocation</param-name>-->
            <!--<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>-->
        <!--</init-param>-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>




    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
1

1 Answers

1
votes

I believe the issue is with

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

Instead, you should use a PropertySourcesPlaceholderConfigurer

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

Which

From Spring 3.1 onward, the XML will no longer register the old PropertyPlaceholderConfigurer but the newly introduced PropertySourcesPlaceholderConfigurer. This replacement class was created be more flexible and to better interact with the newly introduced Environment and PropertySource mechanism; it should be considered the standard for 3.1 applications.