当前位置: 首页 > 知识库问答 >
问题:

@Runnable@Component类中的异步不允许它自动生成

燕璞
2023-03-14

我有两个类Uploader和UploadTask。使用Spring4。

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

在应用程序启动时,我遇到以下异常:

组织。springframework。豆。工厂BeanCreationException:创建名为“uploader”的bean时出错:自动连线依赖项的注入失败;嵌套的异常是org。springframework。豆。工厂BeanCreationException:无法自动关联字段:private com。xx。上传。上传任务com。xx。上传。上传者。任务嵌套的异常是org。springframework。豆。html" target="_blank">工厂NoSuchBeanDefinitionException:未找到依赖项类型为[com.xx.uploading.UploadTask]的符合条件的bean:应至少有1个bean符合此依赖项的autowire候选项的条件。依赖项批注:{@org.springframework.beans.factory.annotation.Autowired(required=true),@org.springframework.beans.factory.annotation.Qualifier(value=uploadTask)}

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

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

共有3个答案

方昊英
2023-03-14

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

谢夜洛
2023-03-14

在类级别使用@enablesync。

@Component
@EnableAsync
public class UploadTask implements Runnable{
   @Async
   public void soso(){
   }
   public void run(){
   }
 }
梁丘伟
2023-03-14

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

     @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---------");
  }
}

Springxml

  <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();
  }
 }

上传任务接口

@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时,该具体类和代理之间将面临类型冲突。

 类似资料:
  • 问题内容: 我正在尝试使用swagger定义post端点,但是不允许使用该参数: 当我跑步时,我得到这个: 我的规格有什么问题? 问题答案: 您可能正在混合使用OpenAPI / Swagger 2.0和OpenAPI 3.0语法。您的规格似乎是2.0,但是关键字是3.0功能。在2.0中,请求正文被定义为正文参数: 更多信息:描述请求正文

  • 我正在尝试缓存一个网站的站点地图,它是从我正在工作的一个网站的控制器生成的,但显然我做错了什么,因为我不理解错误消息。下面是造成问题的代码片段(它是一个控制器方法)。在添加缓存之前,一切都正常工作。

  • 当使用JDK 8运行javadoc并收到此错误时,最好的解决方法是什么。 对于JDK 8,似乎已经决定使用

  • 我试图得到以下每个元素使用 inspect元素的输出如下。 但是它失败了,并抛出下面的错误。 另外,我如何遍历每个类?每个类都包含子部分,我想在进入下一个类之前进一步单独处理这些子部分。

  • 假设我们有一个带有签名的函数 是否有可能实施一个约束来确保a和b是不同的?那就是 这个问题的目的是了解更多关于Haskell的信息,并可能解决我面临的一个设计问题。如果a==b,我的特殊情况是没有意义的,所以我想在编译器级别禁止这样做。我可能会用一个完全不同的设计来解决这个问题,但这不仅仅是现在的重点--潘多拉盒子已经打开,我想知道类型级别上的等式约束是否可能。

  • 我预计我的< code>UICollectionView会有问题,基本上当我清除约束时,它会完美地滚动,尽管我无法到达底部(但那是另一天的事情),但是宽度太大了,我只能看到我的< code>UICollectionView的左半部分。 现在,当我设置使其适合屏幕时,它将不再滚动。即使UIRefreshControl也不会触发。 我没有办法了,有人有线索吗?或者解决办法? 非常感谢! 编辑:它不会滚