2013-03-27 3 views
3

У меня есть следующие классы:Ошибка в инстанцировании боб весной 3,1

public abstract class AbstractBusinessModule { 

} 

public class MS3BusinessModule extends AbstractBusinessModule 
{ 
    public MS3BusinessModule(SomeOtherClass value) 
    { 

    } 
} 

И следующие объявления боба:

<bean id="ms3BusinessModule" class="com.hba.MS3BusinessModule" > 
    <constructor-arg index="0"> 
     <ref bean="someOtherBeanID"/> 
    </constructor-arg> 
    <aop:scoped-proxy /> 
</bean> 

При запуске моего приложения я получаю следующее сообщение об ошибке:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ms3BusinessModule' defined in BeanDefinition defined in class path resource [spring.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.hba.MS3BusinessModule]: 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 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at com.hba.EhCacheTest.main(EhCacheTest.java:16) 
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.hba.MS3BusinessModule]: 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 
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:212) 
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112) 
    at org.springframework.aop.scope.ScopedProxyFactoryBean.setBeanFactory(ScopedProxyFactoryBean.java:109) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1439) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1408) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    ... 11 more 
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given 
    at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721) 
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499) 
    at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) 
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) 
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) 
    at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285) 
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:200) 
    ... 16 more 

Что может быть неправильным?

Если я удалю <aop:scoped-proxy/> из декларации bean, он будет работать.

Обновление: если я поместил конструктор по умолчанию в MS3BusinessModule, он будет работать. Я не понимаю причину, по которой требуется конструктор по умолчанию. может кто-нибудь объяснить пожалуйста.

+0

Как выглядит 'AbstractBusinessModule'? – clav

+0

Разве это не что-то в java, когда у вас есть параметризованный конструктор, вы должны определить конструктор по умолчанию? – SRy

+0

@SrinivasR no, _if_ вы хотите конструктор no-arg _and_ у вас также есть те, которые принимают аргументы _then_ вам нужно сделать no-arg одним явным, но отлично, чтобы класс не имел никакого конструктора по умолчанию вообще. –

ответ

4

If I put a default constructor in MS3BusinessModule, it works. I do not understand the reason why a default constructor is required. can somebody explain please.

Путь <aop:scoped-proxy/> работа является скрывалась «реальный» боб под другим именем и создать прокси-класс CGLIB который является подклассом класса реального бин, и который делегирует все вызовы методов правильного экземпляра целевого компонента. Таким образом, у вас есть два различных вида объекта здесь:

  • п экземпляров com.hba.MS3BusinessModule для каждого сеанса/запроса/независимо от сферы является и
  • один синглтон экземпляр динамически генерируемого прокси-класса.

В п целевых бобы построены с помощью конструктора, который принимает аргументы, с <constructor-arg> значений, переданных ему, но прокси-классу нужен без аргументов конструктора суперкласса для вызова (который, конечно, может быть объявлен protected а не public). Механизм прокси никогда не будет называть ни один из методов суперкласса экземпляра прокси, так как все вызовы переходят к целевому экземпляру, но прокси-класс должен расширить класс целевого компонента, чтобы прокси-сервер был instanceof. правильный тип.

Альтернативного исправление для обеспечения интерфейсу что M3BusinessModule инвентаря, и сделать все ссылки от других бобов к этому использовать тип интерфейса, а не конкретный типа класса. Это позволит Spring использовать прокси-сервер java.lang.reflect вместо CGLIB, реализуя интерфейс без необходимости расширения конкретного класса.