2013-03-05 13 views
27

イムを与えなかった。スーパークラスがヌルコンストラクタを持っていませんが、引数が自分のアプリケーションで春社会を使用して

<spring.framework.version>3.2.0.RELEASE</spring.framework.version> 
<hibernate.version>4.1.9.Final</hibernate.version> 
<commons-dbcp.version>1.4</commons-dbcp.version> 
<org.springframework.social-version>1.1.0.BUILD-SNAPSHOT</org.springframework.social-version> 
<org.springframework.social.facebook-version>1.1.0.BUILD-SNAPSHOT</org.springframework.social.facebook-version> 
<org.springframework-version>3.2.1.RELEASE</org.springframework-version> 
<org.springframework.security.crypto-version>3.1.3.RELEASE</org.springframework.security.crypto-version> 

私は私にHomeControllerに

private final Facebook facebook; 

@Inject 
public SearchController(Facebook facebook) { 
    this.facebook = facebook; 
} 

を適用する場合:

@Controller 
public class HomeController { 


    private final Facebook facebook; 

    @Inject 
    public HomeController(Facebook facebook) { 
     this.facebook = facebook; 
    } 

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class); 

    /** 
    * Simply selects the home view to render by returning its name. 
    */ 
    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Model model) { 
     return "home"; 
    } 

} 

インジェクションのような注入作用があり、私はfacebookから情報を得ることができます。私はこの1つ

@Controller 
@Transactional 
@RequestMapping(value = "/search") 
public class SearchController { 

    private static final Logger logger = LoggerFactory.getLogger(SearchController.class); 

    private final Facebook facebook; 

    @Inject 
    public SearchController(Facebook facebook) { 
     this.facebook = facebook; 
    } 

    @PersistenceContext 
    private EntityManager entityManager; 

    ... 

のように私の他のCotrollersのいずれかにそれを適用する場合しかし、私はこのエラーを取得:

mar 05, 2013 12:46:36 EM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/project] threw exception [Request processing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'searchController' defined in file [C:\Users\Nilsi\Downloads\springsource\vfabric-tc-server-developer-2.7.2.RELEASE\base-instance\wtpwebapps\course_info\WEB-INF\classes\com\courseinfo\project\controller\SearchController.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.courseinfo.project.controller.SearchController]: 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] with root cause 
java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given 
    at org.springframework.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721) 
    at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:499) 
    at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) 
    at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) 
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) 
    at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:285) 
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:205) 
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:111) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:477) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:362) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:412) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1492) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1117) 
    at org.springframework.web.method.HandlerMethod.createWithResolvedBean(HandlerMethod.java:202) 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:233) 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:55) 
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:297) 
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1091) 
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1076) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:896) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

私の推測では、私は、注釈付きコントローラにログインfacebookを注入することができないということです@トランザクション?私は周りにグーグルではなく、これに対して任意の解決策を見つけることができません。

+0

プロパティベースの注入を使用すると機能しますか? –

+0

うわー、それは働いた!あなたが答えとしてそれを置くなら、それを正しいものとしてマークします。 私は単純にコンストラクタを削除し、これに変更しました: @Inject プライベートFacebook facebook; 以前には動作していたが、元々は変数が元の状態だったためテストできなかった。 (私はそれを得たスプリングの例のコードで最終的だった)。 – nilsi

答えて

53

CGlibには1つの重要な制限があります。ターゲットクラスはデフォルトのコンストラクタを提供する必要があります。

コンストラクタベースの注入の代わりにプロパティベースの注入を使用すると、問題はなくなります。

+40

この回答をエキスパンドする:コントローラに '@ Transactional'を追加しなかった場合、これはコンストラクタインジェクション(これが優先されます)によってうまくいきました。 '@ Transactional'を追加すると、AOPが起動し、プロキシを作成する必要があります。 CGLibにはデフォルトコンストラクタが必要です。別の解決策は、プロキシの代わりにAspectJを使うようにSpringトランザクションを設定することです。これにはもう少しセットアップが必要ですが、デフォルトコンストラクタを持たないクラスのトランザクションを許可します。 –

+3

これは非常に良いコメントです!私はそれを答えに加えるべきだと思う。 –

+6

Spring 4より前のCGLIBベースのプロキシクラスでは、デフォルトコンストラクタが必要です。これはCGLIBライブラリの制限ではなく、Spring自体です。幸いにも、春4の時点ではもうこれは問題ではありません。 CGLIBベースのプロキシクラスは、もは​​やデフォルトのコンストラクタを必要としません。この記事を参照してください:http://blog.codeleak.pl/2014/07/spring-4-cglib-based-proxy-classes-with-no-default-ctor.html –

0

これに対処するために空のデフォルトのコンストラクタを作成しました。

関連する問題