0

私は2つのクラスを持っています

public class Abcd{

    private String username;
    private String password;

    public Abcd(@Value("${username}") String userName, @Value("${password}") String password) {
        ...
    }

    public String retrieveValues(){
     ......
     return "someString";
    }

}

public class SomeClass{
    @Autowired
    private Abcd obj;

    public String method1(){
    obj.retrieveValues();
}

私は以下のようなXmlを持っています。

<context:annotation-config />
<context:property-placeholder location="classpath:applNew.properties" />

<bean id="abcd" class="com.somecompany.Abcd">
    <constructor-arg type="java.lang.String" value="${prop.user}" />
    <constructor-arg type="java.lang.String" value="${prop.password}" />
</bean>

<bean id="someclass"
    class="com.differentcompany.SomeClass">
</bean>

プロジェクトをビルドしてサーバーを起動すると、以下の例外が表示されます。

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'abcd' defined in URL []: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class []: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

この方法でコンストラクターを注入する際に何が問題になるのかわかりません。これに対する解決策はありますか?

4

1 に答える 1

3

CGLIB (AOP サポート用) によってプロキシされるクラスには、引数なしのコンストラクターが必要です。

これらの引数のないコンストラクターは、そうpublicである必要はなく、他のものには影響しません。通常どおり、他のコンストラクターを使用できます。

public class Abcd{
    // Dummy constructor for AOP
    Abcd() {}

    public Abcd(@Value("${username}") String userName, @Value("${password}") String password) { ... }   
    ...
}

以下も参照してください。

于 2012-12-04T21:05:33.360 に答える