2

// 2 つのサードパーティ ファクトリ:

public class OneStaticMethodFactory {
 ...
 public static Object createFactory(String oneInstanceMethodFactoryClassName) {
  ...
 }
}

public class OneInstanceMethodFactory {
 ...
 public OneObject createObject() {
  ...
 }
}

// ハードワイヤード コード:

OneInstanceMethodFactory oneInstanceMethodFactory = 
 (OneInstanceMethodFactory) 
  OneStaticMethodFactory.createFactory("pkg.to.OneInstanceMethodFactory");

OneObject oneObject =
 oneInstanceMethodFactory.createObject(); 

// それらを Spring Bean に置き換えようとします:

<bean id="oneInstanceMethodFactory" class="pkg.to.OneStaticMethodFactory"
 factory-method="createFactory">
  <constructor-arg value="pkg.to.OneInstanceMethodFactory">
  </constructor-arg>
</bean>

<bean id="oneObject" factory-bean="oneInstanceMethodFactory"
 factory-method="createObject">
</bean>

// Spring IoC を実行します。

java.lang.IllegalStateException: Failed to load ApplicationContext
    ...
Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'oneObject' defined in class path resource [applicationContext.xml]: 
No matching factory method found: factory bean 'oneInstanceMethodFactory'; 
factory method 'createObject()'. 
Check that a method with the specified name and arguments exists and that it is non-static.
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:528)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1015)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:605)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
        at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)
        at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
        at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
        at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
        at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
        ... 26 more

上記の問題を解決するには、Spring で oneInstanceMethodFactory Bean をコンパイル時型 Object から実行時型 OneInstanceMethodFactory にダウンキャストする方法を教えてください。(2 つのサードパーティ ファクトリ クラスの変更は、問題のポイントではありません。)

@編集

からのヒントのおかげで@Boris Treukhov、最終的に私は問題が何の関係もないことを理解しましたがtype downcast、実際には自分のタイプミスによるものではなく、OneStaticMethodFactory#createFactory他のランタイムタイプを返しました. OneInstanceMethodFactoryハードワイヤード コードからSpring IoC / DI上記への移行後、すべてが期待どおりに機能するようになりました。

4

1 に答える 1

1

'oneInstanceMethodFactory'が実際にインスタンスであることを確認する必要があります。これには 、コンテナーのメソッドを介してOneInstanceMethodFactory名前で作成された Bean タイプを確認するか、デバッガーでによって返された値を調べます。"oneInstanceMethodFactory"getBean()createFactory

私の経験では、この例外は非常に簡単です。通常、そのような公開された非静的メソッドは実際にはありません。

Objectインスタンスをthis引数として受け取るリフレクション メソッドを介してメソッドが呼び出されるため、ダウンキャストは違いはありません。Bean タイプは、ファクトリ メソッドから返される値によって決定されます。Spring は、Bean が初期化される前にクラスを知る必要はありません。実際、 oneObjectBean は依存しているため、後者の Bean は前者の前に完全に初期化され、Spring はそのメソッドoneInstanceMethodFactoryを呼び出すことができます。createObject

于 2012-11-23T22:49:27.300 に答える