Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Runnable@Component类中的Async不允许它自动连接_Java_Spring_Spring Mvc - Fatal编程技术网

Java @Runnable@Component类中的Async不允许它自动连接

Java @Runnable@Component类中的Async不允许它自动连接,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有两个类Uploader和UploadTask。使用弹簧4 @Service public class Uploader{ @Autowired private UploadTask task; } @Component public class UploadTask implements Runnable{ @Async public void soso(){ } public void run(){ } } 在应用程序启动时,我遇到以下

我有两个类Uploader和UploadTask。使用弹簧4

 @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:创建名为“uploader”的bean时出错:自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动连线字段:private com.xx.uploading.UploadTask com.xx.Uploader.task;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:未找到依赖项类型为[com.xx.upload.UploadTask]的符合条件的bean:至少需要1个符合此依赖项autowire候选项条件的bean。依赖项批注:{@org.springframework.beans.factory.annotation.Autowired(required=true),@org.springframework.beans.factory.annotation.Qualifier(value=uploadTask)}

我认为这可能是因为UploadTask是可运行的。当我删除@Async注释时,它不会引发任何异常。有什么解释吗

更新:
当我看到日志时,我发现UploadTask类bean正在创建中。自动连线时找不到它。

有一个用于私有上传任务的公共setter;和测试。

在类级别使用@enablesync

@Component
@EnableAsync
public class UploadTask implements Runnable{
   @Async
   public void soso(){
   }
   public void run(){
   }
 }
在context.xml文件中配置服务类。
像下面的代码。
用您的数据源名称更改xxx。

我已成功运行此代码。请看下面我的代码

     @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" />
下面是我的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>   
上传任务接口

@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的组件转换为代理,实现该组件类使用的相同接口,因此当使用具体类生成autowire时,该具体类和代理之间将面临类型冲突。

这是多余的。批注可以做到这一点。@EnableAsync没有帮助。无论如何,我已经在上下文文件中编写了。所以这个注释不做任何额外的事情。我已经提到删除@Async可以解决这个问题。因此,这不是一个公众设定者的问题。我看不到你的回答中有任何特别的补充。我该怎么做才能使我的案子成功?此外,您的类和上下文中都没有@EnableAsync。如果没有这个,你的案子就不应该运行。我已经修改了答案,以满足你的要求。请评论它是否适合您。您是否尝试过此解决方案。这对我有用。你也会因此得到同样的错误。请分享错误的详细信息。是的,我尝试了你的解决方案。我也遇到了同样的错误。
@Async
需要创建代理,并且根据您的配置,代理类型为
可运行
。因此,没有办法在可运行的内部创建一个异步方法吗?或者先创建一个
上传任务
接口,让组件实现它,或者更改代理spring配置中的配置。当然,假设这就是问题所在,制作一个单独的接口是行不通的。
@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();
  }
 }
@Component
public interface UploadTask extends Runnable{
  @Async
  public void soso();
  public void run();
}
public class UploadTaskImpl implements UploadTask{

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