2016-02-03 3 views
5

を取得させることはありません。アプリケーションの起動時に春4.@Asyncは、それが私は2つのクラスアップローダーとUploadTaskを持ってAutowired

@Service 
public class Uploader{ 
    @Autowired 
    private UploadTask task; 
} 
@Component 
public class UploadTask implements Runnable{ 
    @Async 
    public void soso(){ 
    } 
    public void run(){ 
    } 
} 

を使用して、私は次の例外を取得:

org.springframework.beans.factory.BeanCreationException:エラーが 'アップローダー' の名前でBeanを作成:autowired依存性の注入に失敗しました;ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:フィールドautowireできませんでした:プライベートcom.xx.uploading.UploadTask com.xx.uploading.Uploader.taskを。依存見つかり[com.xx.uploading.UploadTask]タイプの無修飾ビーン:期待される少なくとも1ビーンこの依存性のためにautowire候補としての資格をネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionあります。依存注釈:{org.springframework.beans.factory.annotation.Qualifier(値= uploadTask)@ org.springframework.beans.factory.annotation.Autowired(=真必須)}

私はこのかもしれないと思いますUploadTaskがRunnableであるためです。 @Asyncアノテーションを削除すると、例外がスローされません。説明はありますか?

アップデート: 私はUploadTaskクラスBeanが無事作成されていることが判明したログを見ました。 autowiring中に見つかりません。

+1

'@ Async'はプロキシの作成を必要とし、設定に応じてプロキシのタイプは' Runnable'です。 – zeroflagL

+0

Runnable内でAsyncメソッドを作成する方法はありませんか? – zafar142003

+0

まずUploadTaskインターフェースを作成して、コンポーネントがそれを実装するか、またはバネ構成のプロキシ設定を変更させます。もちろんこれが問題だと仮定します。 – zeroflagL

答えて

-1

は、プライベートUploadTaskタスクの公共セッターを持っています。テスト。

+0

@Asyncを削除すると問題が解決すると述べました。したがって、公的セッターの問題ではありません。 – zafar142003

0

クラスレベルで使用@EnableAsync。

@Component 
@EnableAsync 
public class UploadTask implements Runnable{ 
    @Async 
    public void soso(){ 
    } 
    public void run(){ 
    } 
} 
+0

@EnableAsyncは役に立ちません。とにかく私はすでにをコンテキストファイルに書いていました。したがって、この注釈は余分なことはありません。 – zafar142003

-1
configure your service classes in the context.xml file. 
like the below codes. 

<bean id="Uploader" class="packageName.Uploader"> 
    <property name="task" ref="task"/> 
</bean> 

<bean id="task" class="packageName.UploadTask "> 
    <property name="xxx" ref="xxx"/> 
</bean> 
change xxx with your datasource name. 
+0

これは冗長です。アノテーションがこれを行います。 – zafar142003

1

私は正常にこのコードを実行しています。以下の私のコードを見てください。以下は

 @Service 
public class Uploader{ 
    @Autowired 
    private UploadTask task; 

    public void display(){ 
     task.run(); 
     task.soso(); 
    } 
} 

@Component 
public class UploadTask implements Runnable{ 
    @Async 
    public void soso(){ 
     System.out.println("Upload task running---"); 
    } 
    public void run(){ 
     System.out.println("Running the class UploadTask---------"); 
    } 
} 

Spring.xml

<mvc:annotation-driven/> 
    <context:component-scan base-package="com.exp" /> 

私のテストクラスは以下

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath*:/META-INF/spring/spring.xml"}) 
public class TestScope { 

    @Autowired 
    Uploader uploader = null; 

    @Test 
    public void testScope() 
    { 
     uploader.display(); 

    } 
} 

私がテストクラスを実行すると、それは、私のpom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>SpringAsync-Exmp</groupId> 
    <artifactId>SpringAsync-Exmp</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.2.RELEASE</version> 
    </parent> 

    <properties> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.9</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>${spring.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
      <scope>provided</scope> 
     </dependency> 

    </dependencies> 


    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

ですUploadTaskにsysoutを正常に印刷します。

UPDATE 私は@EnableAsyncで実行するようにコード化された変更しました。変更されたコードを下に見てください。

アップローダクラス

@EnableAsync 
@Service 
public class Uploader{ 
    @Autowired 
    private UploadTask uploadTask; 


    public UploadTask getUploadTask() { 
    return uploadTask; 
} 


public void setUploadTask(UploadTask uploadTask) { 
    this.uploadTask = uploadTask; 
} 


public void display(){ 
     uploadTask.run(); 
     uploadTask.soso(); 
    } 
} 

UploadTaskインタフェース

@Component 
public interface UploadTask extends Runnable{ 
    @Async 
    public void soso(); 
    public void run(); 
} 

UploadTaskImplクラス

public class UploadTaskImpl implements UploadTask{ 

     public void soso() 
     { 
      System.out.println("Inside the class----"); 
     } 
     public void run() 
     { 
      System.out.println("Inside the class--run--"); 
     } 
} 

それ以外はすべて同じです。今回はUploaderTaskをインターフェースとして作成し、それを実装する新しいクラスを作成しました。これは問題を解決します。

@EnableAsyncは、このコンポーネントクラスで使用されているのと同じインターフェイスを実装する@Asyncを使用するコンポーネントを@Asyncで変換していると思うので、具体的なクラスのautowireを作成すると、

+0

答えに特別な追加はありません。私のケースを機能させるために私は何をすべきですか?それ以外に、あなたのクラスには@EnableAsyncも、あなたの文脈ではもありません。あなたの事件はこれがなければ実行されるべきではありません。 – zafar142003

+0

私はあなたの要件を満たすために答えを変更しました。あなたのために働くかどうかをコメントしてください。 –

+0

申し訳ありませんが、これも機能しません。 – zafar142003

関連する問題