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