Hi,

I have found this bug in 1.8.2 and 2.0.2. I haven't seen the last version
yet.

We have the following bean with scope prototype

    <bean id="mailMessage"
class="org.springframework.mail.SimpleMailMessage"
        scope="prototype">
        <property name="from" value="${mail.default.from}" />
    </bean>

Then we inject this bean to every controller where we want to send some
email message.

    <bean id="userFormController"
class="ru.icl.ios.mzioppd.webapp.controller.UserFormController">
        <property name="validator" ref="beanValidator"/>
        <property name="formView" value="userForm"/>
        <property name="successView" value="redirect:users.html"/>
        <property name="cancelView" value="redirect:mainMenu.html"/>
        <property name="userManager" ref="userManager"/>
        <property name="roleManager" ref="roleManager"/>
        <property name="mailEngine" ref="mailEngine"/>
        <property name="message" ref="mailMessage"/>
        <property name="templateName" value="accountCreated.vm"/>
    </bean>
and
    <bean id="passwordHintController"
class="ru.icl.ios.mzioppd.webapp.controller.PasswordHintController">
        <property name="userManager" ref="userManager"/>
        <property name="messageSource" ref="messageSource"/>
        <property name="mailEngine" ref="mailEngine"/>
        <property name="message" ref="mailMessage"/>
    </bean>

So, the object mailMessage in the different controllers will be different
too, becouse bean mailMessage has scope="prototype". But what about
UserFormController in concurrent requests?? UserFormController is singleton,
becouse singleton is default scope in spring with dtd 2.0. And a custom
default scope isn't defined...

<beans xmlns="http://www.springframework.org/schema/beans"; xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance";
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd";
       default-lazy-init="true">

Have we concurrent modification of mailMessage object???

I think that we have. Probably, we should use the following code... Or use
another approach(synhronize send method or create a new message every time
in controller).

    <bean id="mailMessage"
class="org.springframework.mail.SimpleMailMessage"
        scope="request">
        <property name="from" value="${mail.default.from}" />
        <aop:scoped-proxy>
    </bean>

P.S
I'm sorry for my bad English :))

Marat Kamalov.

Reply via email to