Проблемы внедрения зависимостей конструктора Spring

у меня 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

Я не понимаю, в чем может быть проблема, чтобы сделать конструктор таким образом. Есть ли какое-нибудь решение для этого?


person iuser    schedule 04.12.2012    source источник
comment
Вы уверены, что Abcd компилируется? Аргумент конструктора userName не имеет типа.   -  person MarkOfHall    schedule 05.12.2012
comment
почему вы передаете @Value в конструктор Abcd, если вы передаете значения через spring (через ${prop.user})?   -  person Andrei Sfat    schedule 05.12.2012
comment
@AndreiSfat: я пытался не передавать значения, но потом вижу другое исключение, похожее на исключение.   -  person iuser    schedule 05.12.2012
comment
извините, это опечатка. его имя пользователя String   -  person iuser    schedule 05.12.2012
comment
По какой-то причине у вас есть прокси cglib. Можете ли вы опубликовать полную конфигурацию весны?   -  person mbelow    schedule 05.12.2012


Ответы (1)


Классы, которые будут проксироваться CGLIB (для поддержки АОП), должны иметь конструкторы без аргументов.

Эти конструкторы без аргументов не обязательно должны быть public, и это не влияет ни на что другое — вы можете использовать другие конструкторы, как обычно:

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

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

См. также:

person axtavt    schedule 04.12.2012
comment
Почему АОП оказался в центре внимания, когда я его не использовал. Я просто пытаюсь конструктор ввести значения. - person iuser; 05.12.2012
comment
@iuser: Возможно, вы используете функцию, требующую AOP: @Transactional, @Async, @Cache, безопасность и т. д. - person axtavt; 05.12.2012