2016-04-26 20 views
1

私はCentOSに6.7上でJava 1.8.0_92で実行されているext3の上に設置のTomcat 8.0.33への私の春4.0.1.RELEASE Webアプリケーションをデプロイすると、私は次のエラーを取得:奇妙なTomcatの8展開行動

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'qualityAuditTokenService' defined in URL [jar:file:/home/www/webapps/ROOT/WEB-INF/lib/product-service-2.0.1-SNAPSHOT.jar!/com/company/product/services/QualityAuditTokenService.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.company.workflow.dao.TokenDao]: : No qualifying bean of type [com.company.workflow.dao.TokenDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.company.workflow.dao.TokenDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:742) 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1114) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1017) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4811) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1092) 
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1834) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.company.workflow.dao.TokenDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:806) 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:734) 
    ... 28 more 

をしかし、CentOS 6.7のJava 1.8.0_92上で動作するNFSマウントにインストールされたTomcat 8.0.33とまったく同じWebアプリケーションをインストールしてもうまく動作します。また、CentOSのext3のTomcat 7.0.69、Ubuntuのext4のTomcat 8.0.33、WindowsのNTFSにインストールすればうまく動作します。だから、CentOSのext3のTomcat 8.0.33でこのエラーが発生しているだけです。これが私たちのライブデプロイメント環境でなければ、あまり問題にならないでしょう。

これは明らかに、標準の「欠落注釈」または「JARから欠落しているBeanクラス」タイプの問題ではありませんが、私が何かを見逃してしまった場合のこの提案の提案を聞いてうれしいです。

このデプロイメントに関する奇妙なことは、Spring Beanが異なるファイルシステム上で異なる順序で作成されることです。例外をスローバージョンでは、このBeanの作成が​​ある -

DEBUG DefaultListableBeanFactory:449 - Creating instance of bean 'tokenDaoHbm' 
DEBUG DefaultListableBeanFactory:249 - Returning cached instance of singleton bean 'sessionFactory' 
DEBUG DefaultListableBeanFactory:249 - Returning cached instance of singleton bean 'searchSessionFactory' 
DEBUG DefaultListableBeanFactory:750 - Autowiring by type from bean name 'tokenDaoHbm' via constructor to bean named 'sessionFactory' 
DEBUG DefaultListableBeanFactory:523 - Eagerly caching bean 'tokenDaoHbm' to allow for resolving potential circular references 
DEBUG DefaultListableBeanFactory:249 - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 
DEBUG DefaultListableBeanFactory:249 - Returning cached instance of singleton bean 'org.springframework.cache.config.internalCacheAdvisor' 
DEBUG AnnotationTransactionAttributeSource:108 - Adding transactional method 'TokenDaoHbm.update' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' 
DEBUG InfrastructureAdvisorAutoProxyCreator:551 - Creating implicit proxy for bean 'tokenDaoHbm' with 0 common interceptors and 1 specific interceptors 
DEBUG JdkDynamicAopProxy:117 - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [[email protected]] 
DEBUG DefaultListableBeanFactory:477 - Finished creating instance of bean 'tokenDaoHbm' 

これは、それが作成された依存関係を満たすでしょうBeanです:仕事のバージョンでは、以下が限界に達しロギング春とログファイルに表示されます。その欠如のために注目に値する。

TLは、DR

だから、どのOS、ファイルシステムの種類および/またはネットワークの待ち時間は春が(そうでないか、依存関係の分析だ破る)豆を作成する順序を変更できますか?確かに、これはWARファイル(およびそれがパッケージ化されているSpringのバージョン)に託されているものですか?

@ComponentScanと@Qualifierを介してBeanの作成に影響を与えようとしましたが、他のアプローチはありますか?

この問題は、下にリンクされているものと似ていますが、ポストされた解決策はありません(また、Tomcat 7では問題ありません)。この1つは本当に私を厄介されて Need help debugging Tomcat 7 application error

これですべてのヘルプは非常に、感謝しました! :-D

答えて

0

これは解決策があります(回答が投稿されています)が、醜いですが、なぜこれが必要なのかまだ説明がありません(したがって、または完全な説明)。

は、それは私の問題は、ASFのはbugzillaで育っ57129を発行するために関連して判明: https://bz.apache.org/bugzilla/show_bug.cgi?id=57129

しかし、そこに概説された場合には、WAR内の複数のJARファイルが同じクラスファイルの異なるバージョンが含まれています。つまり、アプリケーションの動作を変更する順序を変更することは好ましくありません。

私の場合、問題のクラスTokenDaoHbmは、WARファイルに1回しか存在しません。それはTomcatクラスローダが、qualityAuditTokenService beanをインスタンス化するためにSpringが来るまでにproduct-dao-hibernate-2.0.1-SNAPSHOT JARファイルをロードしていない場合、NoSuchBeanDefinitionExceptionを取得します。確かに、SpringやTomcatは、Beanのインスタンス化を開始する前に、すべてのクラスをロードする必要があることを知っていなければなりません。誰もが、さらに光を当てることができれば

<Resources> 
    <PreResources className="org.apache.catalina.webresources.FileResourceSet" 
       base="${catalina.base}/webapps/ROOT/WEB-INF/lib/product-dao-hibernate-2.0.1-SNAPSHOT.jar" 
       webAppMount="/WEB-INF/lib/product-dao-hibernate-2.0.1-SNAPSHOT.jar" /> 
</Resources> 

だから、私の問題を解決するために、私は、ASFのバグへの投稿でマーク・トーマスからのアドバイスに従って、WARに自分のアプリケーションのcontext.xmlで次のように配置しました私は受け入れられた答えとしてそれらをマークして嬉しいです。