0

私はこの問題にこだわった。

使用されるコンポーネント:Spring 1.2.8、Hibernate 3.2.0 cr1、tomcat、struts、java 6

スコープ=プロトタイプでProxyFactoryBeanからBeanを取得しようとしています。私は成功していません。何が悪いのかわかりません。

コンテキストは次のとおりです。

<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>

私が次のことをするときのコードで:

...................。

...................。

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

checkTask BeanでsetTestCaseを呼び出そうとすると、次の例外が発生しました。

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)

ProxyFactoryBeanでruleCheckTaskPrototypeの代わりにruleCheckTaskを使用した場合は機能していました。問題は、その場合、常にruleCheckTaskのシングルトンを取得することです。そして、私は常に新しいインスタンスが必要です。RuleCheckTaskがRunnableインターフェイスを実装する小さなことの1つ。

誰かが私にヒントを与えることができますか?

ありがとうございました

4

1 に答える 1

1

試してみてください:

<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>

targetSource代わりに(no target)を設定することもできますruleCheckTaskPrototype。違いは、最初のインスタンスではプロキシ構成の独立したインスタンスがあり、2番目のPrototypeTargetSourceインスタンスではリクエストごとに新しいインスタンスを取得することです。

于 2012-11-18T13:44:36.393 に答える