0

BeanPostProcessor の使用に問題があります。エラー ログには、productFactory クラスのメソッド josh() が見つからないことが示されていますが、クラスにはそのようなメソッドがあり、静的ではありません。以下はコードスニペットです。

web.xml

<bean class="demoproject.productPostProcessor" /> 
    <context:annotation-config />
<context:component-scan base-package="demoproject" />
<bean name="ProductFactory" class="demoproject.ProductFactory" />

ProductFactory.java

public class ProductCreater{
  public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("web.xml");

        Product copyProduct = (Product) context.getBean("joshs");
        System.out.println(copyProduct.getId());
        System.out.println(copyProduct.getPrice());
   }
}

ProductFactory.java

package demoproject;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

@Configuration
public class ProductFactory {


    public ProductFactory() {
        // TODO Auto-generated constructor stub
    }

    @Bean(name="joshs") 
    public Product josh(){
        Product josh = new Battery();
        josh.setId("cdrw");
        return josh;
    }


}

productPostProcessor.java

package demoproject;

import org.springframework.beans.factory.config.BeanPostProcessor;

public class productPostProcessor  implements BeanPostProcessor{

    public Object postProcessBeforeInitialization(Object bean, String beanName){
        System.out.println("Before initializing .. : "+beanName);
        return beanName;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName){
        System.out.println("After initializing .. : "+beanName);
        return beanName;

    }   
}

エラーログ

INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7b09df06: defining beans [demoproject.productPostProcessor#0,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,productFactory,ProductFactory,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,joshs]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'joshs' defined in class path resource [demoproject/ProductFactory.class]: No matching factory method found: factory bean 'ProductFactory'; factory method 'josh()'. Check that a method with the specified name exists and that it is non-static.

どういうわけか <bean class="demoproject.productPostProcessor" /> web.xml の行がこの問題を引き起こしています。なぜなら、それを削除するとすべてが正常に機能するからです。このプログラムをデバッグして修正するにはどうすればよいですか?

4

2 に答える 2

2

Bean の名前を返しています。postProcessメソッドは、実際の Bean 自体を返すことになっています。ProductBean をString名前を含むaに置き換えるように Spring に指示しています。

于 2013-08-16T06:18:52.940 に答える
0

あなたのコードとして、ファクトリメソッドを使用して Product オブジェクトを初期化しようとしていると思います。私が正しい場合、最初にメソッドを静的にする必要があり、次にメソッドを Bean 定義で指定する必要があります。

<bean name="ProductFactory" class="demoproject.ProductFactory" factory-method="joshs"/>
于 2013-08-16T07:42:43.500 に答える