2017-06-01 12 views
0

次のBean宣言xmlがあります。春:TaskExecutorImpl型の値をjava.util.concurrent.Executorに変換できません

<bean id="taskExecutor" class="com.XXX.xxx.management.common.executor.TaskExecutorImpl" 
     destroy-method="shutdown"> 
     <constructor-arg name="threadPoolSize" value="5"/> 
     <constructor-arg name="executionQueueCapacity" value="1000"/> 
     <constructor-arg name="typeLimit" value="5"/> 
    </bean> 

以下はTaskExecutorImplのコードです。

import java.util.AbstractQueue; 
    import java.util.ArrayList; 
    import java.util.Collection; 
    import java.util.Comparator; 
    import java.util.Iterator; 
    import java.util.List; 
    import java.util.TreeSet; 
    import java.util.concurrent.BlockingQueue; 
    import java.util.concurrent.CancellationException; 
    import java.util.concurrent.ConcurrentHashMap; 
    import java.util.concurrent.ExecutionException; 
    import java.util.concurrent.ExecutorService; 
    import java.util.concurrent.FutureTask; 
    import java.util.concurrent.RejectedExecutionException; 
    import java.util.concurrent.ThreadPoolExecutor; 
    import java.util.concurrent.TimeUnit; 
    import java.util.concurrent.TimeoutException; 
    import java.util.concurrent.atomic.AtomicInteger; 
    import java.util.concurrent.locks.Condition; 
    import java.util.concurrent.locks.ReentrantLock; 

    import javax.annotation.PostConstruct; 

    public class TaskExecutorImpl implements TaskExecutor { 
     private final int threadPoolSize; 
     private final int executionQueueCapacity; 
     private final int typeLimit; 

     private BlockingPriorityTaskQueue executionQueue; 
     private ExecutorService threadPool; 

     private ConcurrentHashMap<String, AtomicInteger> executionByTypeMap = new ConcurrentHashMap<>(); 

     /** 
     * Main lock guarding all access 
     */ 
     final ReentrantLock mainLock; 
     /** 
     * Condition for waiting takes 
     */ 
     private final Condition notEmpty; 
     /** 
     * Condition for waiting puts 
     */ 
     private final Condition notFull; 

     public TaskExecutorImpl(int threadPoolSize, int executionQueueCapacity, int typeLimit) { 
      this.threadPoolSize = threadPoolSize; 
      this.executionQueueCapacity = executionQueueCapacity; 
      this.typeLimit = typeLimit; 

      mainLock = new ReentrantLock(); 
      notEmpty = mainLock.newCondition(); 
      notFull = mainLock.newCondition(); 
     } 

     @PostConstruct 
     @SuppressWarnings("unchecked") 
     public void initialize() { 
      executionQueue = new BlockingPriorityTaskQueue(executionQueueCapacity); 
      threadPool = new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0L, TimeUnit.MILLISECONDS, 
        (BlockingQueue) executionQueue); 

      // create core threads, required for type control 
      for (int i = 0; i < threadPoolSize; i++) { 
       threadPool.execute(new Runnable() { 
        @Override 
        public void run() { 
         // nothing here 
        } 
       }); 
      } 
     } 

and other Methdods implementation so on 

私はコンテキストを起動すると、私は次のエラー

2017年6月1日06得る:50:22.625 GMT ERROR localhostを-startStop-1 ContextLoader:331 - コンテキストの初期化は org.springframeworkを失敗しました.beans.factory.BeanCreationException: 'org.springframework.context.annotation.internalAsyncAnnotationProcessor'という名前のBeanを作成中にエラーが発生しました:Beanの初期化に失敗しました。ネストされた例外はorg.springframework.beans.ConversionNotSupportedExceptionです:タイプ 'com.xxx.xxx.management.common.executor.TaskExecutorImpl'のプロパティ値をプロパティ 'executor'の必須タイプ 'java.util.concurrent.Executor'に変換できませんでした;ネストされた例外はjava.lang.IllegalStateExceptionです:タイプ[com.xxx.xxx.management.common.executor.TaskExecutorImpl]の値をプロパティ 'executor'の必須タイプ[java.util.concurrent.Executor]に変換できません:一致するエディタがありませんまたは変換戦略でorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) でorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529) で を発見しましたorg.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:293) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) at org.springframework.beans .factory.support.AbstractBeanFactory。 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) の場合は、 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContextでorg.springvmframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) (ContextLoader.java:410)org.springframework.web.contextで で。 ContextLoader.initWebApplicationContext(ContextLoader.java:306) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) at org.apache.catalina.core.StandardContext.ListenerStart(Stan (org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) )コンテナベース.addChildInternalコンテナベース。コンテナベース。 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.jav a:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread。実行(Thread.java:748) 原因:org.springframework.beans.ConversionNotSupportedException:型 'com.messages.nsx.management.commonのプロパティ値を変換できませんでした。executor.TaskExecutorImpl 'をプロパティ' executor 'の必須タイプ' java.util.concurrent.Executor 'に変更します。ネストされた例外はjava.lang.IllegalStateExceptionです:タイプ[com.xxx.xxx.management.common.executor.TaskExecutorImpl]の値をプロパティ 'executor'の必須タイプ[java.util.concurrent.Executor]に変換できません:一致するエディタがありませんまたは変換戦略はorg.springframework.beans.BeanWrapperImplでorg.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:495) でorg.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:464) で を発見しました。 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1465)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValuesで (AbstractAutowireCapableBeanFactory.javaでconvertForProperty(BeanWrapperImpl.java:489) : 1424)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) でorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1160) で... 23以上 原因:java.lang.IllegalStateException:[com.xxx.xxx.management.common.executor.TaskExecutorImpl]タイプの値を、プロパティ 'executor'の必須タイプ[java.util.concurrent.Executor]に変換できません:一致しませんorg.springframework.beans.BeanWrapperImpl.convertIfNecessaryの編集者または変換戦略org.springframework.beans.TypeConverterDelegate.convertIfNecessaryで を見出した(TypeConverterDelegate.java:267) (BeanWrapperImpl.java:449)より

... 29

答えて

0

TaskExecutorImplにはjava.util.concurrent.Executorが実装されていないスタックトレースによると、そして、私たちは実際にはTaskExecutorImplクラスでそれを見ません。

TaskExecutorが実装されていますが、インポートされていないため、どちらも言えません。これは、このインターフェースが同じパッケージに入っていると私たちに言えるだけです。

したがって、その依存関係注入要件を満たす適切なインターフェイスを実装するようにしてください。

+0

TaskExecutorはシンプルなインターフェイスです。 Executorは具象クラスのメンバ変数です。 –

+0

もし、このBeanがSpringコンテキストの非同期インフラストラクチャと完全に無関係であれば、 'taskExecutor'の名前を、AsyncAnnotationPostProcessor'を混同しないように変更することを検討してください –

関連する問題