squirrelInTheBarel
squirrelInTheBarel

Reputation: 154

Spring How to get bean with prototype scope from ProxyFactoryBean

I stuck with this problem.

Used components: Spring 1.2.8, Hibernate 3.2.0 cr1, tomcat, struts, java 6

I am trying to get bean from ProxyFactoryBean with scope = prototype. I am not successful. I have no clue what is wrong.

Here is context:

<beans>

    <bean id="ruleCheckTask" class="rulechecker.RuleCheckTask" singleton="false">

    <bean id="ruleCheckTaskPrototype" class="org.springframework.aop.target.PrototypeTargetSource">
       <property name="targetBeanName" value="ruleCheckTask" />
    </bean>

    <bean id="transactionInterceptorRuleCheckTask" class="org.springframework.transaction.interceptor .TransactionInterceptor">
       <property name="transactionManager"> 
           <ref bean="transactionManager" />
       </property>
       <property name="transactionAttributeSource">
          <value>
              rulechecker.IRuleCheckTask.run=PROPAGATION_REQUIRE S_NEW
          </value>
       </property>
   </bean>

  <bean id="ruleCheckTaskService" class="org.springframework.aop.framework.ProxyFact oryBean">
         <property name="target" ref="ruleCheckTaskPrototype" />
         <property name="proxyInterfaces">
             <value>
                  rulechecker.IRuleCheckTask
             </value>
        </property>
        <property name="interceptorNames">
              <list>
                   <value>transactionInterceptorRuleCheckTask</value>
              </list>
        </property>
   </bean>
</beans>

In code when I do following:

...................

...................

IRuleCheckTask checkTask = (IRuleCheckTask) applicationContext.getBean("ruleCheckTaskService") ; checkTask.setTestCase(oneTestCase);

I got following exception when trying call setTestCase on checkTask bean:

java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknow n Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Un known Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoi npointUsingReflection(AopUtils.java:287)
at org.springframework.aop.framework.ReflectiveMethod  Invocation.invokeJoinpoint(ReflectiveMethodInvocat ion.java:181)
at org.springframework.aop.framework.ReflectiveMethod    Invocation.proceed(ReflectiveMethodInvocation.java :148)
at org.springframework.transaction.interceptor.Transa ctionInterceptor.invoke(TransactionInterceptor.jav a:96)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :170)
at org.springframework.aop.framework.JdkDynamicAopPro xy.invoke(JdkDynamicAopProxy.java:176)
at $Proxy21.setTestCase(Unknown Source)

It was working if in ProxyFactoryBean I used ruleCheckTask instead ruleCheckTaskPrototype. Problem is that in that case I always obtain singleton of ruleCheckTask. And I need always new instance. One small thing RuleCheckTask implements Runnable interface.

Could anybody give me a hint?

Thank you

Upvotes: 0

Views: 1800

Answers (1)

Jose Luis Martin
Jose Luis Martin

Reputation: 10709

try with:

<bean id="ruleCheckTaskService" class="org.springframework.aop.framework.ProxyFact oryBean">
         <property name="targetName" value="ruleCheckTask" />
         <property name="singleton" value="false" />  <!-- this do the trick -->
         <property name="proxyInterfaces">
             <value>
                  rulechecker.IRuleCheckTask
             </value>
        </property>
        <property name="interceptorNames">
              <list>
                   <value>transactionInterceptorRuleCheckTask</value>
              </list>
        </property>
   </bean>

You could also set targetSource (no target) to ruleCheckTaskPrototype instead. The diference is that on the first one, you have an independient instance of the proxy configuration, on the second one, the PrototypeTargetSource gets a new instance on each request.

Upvotes: 1

Related Questions