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

Spring无法连接泛型bean-没有符合类型的bean

孟俊晖
2023-03-14
import java.util.List;

public interface Process<E> {

    List<E> determineChanges(List<Integer> approvalIds);

    void applyChanges(List<E> changeCto);
}

接下来,我将读取器和写入器实现定义如下:

import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@StepScope
public class GenericApprovalReader<T extends Process<U>, U> implements ItemReader<List<U>> {

    private final SomeOtherBeanStepScopedBean otherBean;

    private final T processor;

    @Autowired
    public GenericApprovalReader(SomeOtherBeanStepScopedBean otherBean,
                                 T processor) {
        this.SomeOtherBean = otherBean;
        this.processor= processor;
    }

    @Override
    public List<U> read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        List<Integer> items = this.someOtherBean.read();

        if(items != null) {
            return processor.determineChanges(items );
        } else {
            return null;
        }
    }
}

同样,我也有一个作家:

import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@StepScope
// Note that second type parameter is necessary only due to necessity to parametrize the ItermWriter<List<U>> with the
// same type as is used for parametrization of Approval<U>
public class GenericApprovalWriter<T extends Process<U>, U> implements ItemWriter<List<U>> {

    private final T processor;

    @Autowired
    public GenericApprovalWriter(T processor) {
        this.approvalProcessor = processor;
    }

    @Override
    public void write(List<? extends List<U>> items) throws Exception {
        for(List<U> item: items) {
            this.processor.applyChanges(item);
        }
    }
}

现在,当我尝试将步骤中的读取器和写入器连接到某个@configuration类中时,如下所示:

    @Bean(name="firstProcessingStep")
    Step firstProcessingStep(GenericApprovalReader<FirstProcessor, Item> reader,
                                   GenericApprovalWriter<FirstProcessor, Item> writer) {
        return stepBuilderFactory.get("firstProcessingStep")
                .<List<Item>,List<Item>>chunk(CHUNK_SIZE)
                .reader(reader)
                .writer(writer)
                .allowStartIfComplete(false)
                .build();
    }

根据另一篇关于Spring中泛型bean的Autowiring的文章,这种行为在Spring4.0之后应该是可能的,我正在使用Spring4.0。

共有1个答案

公西星海
2023-03-14

在spring boot应用程序上下文中匹配两个或多个已加载bean的bean是自动连接的时候,会出现预期的单个匹配bean。当bean在Spring Boot中自动连接时,在上下文中会发现两个或多个bean。因此,该bean无法自动布线。考虑将其中一个bean标记为@primary,更新消费者以接受多个bean,或者使用@qualifier来标识应该使用的bean预期为单个匹配bean但找到n。

该类应该用@primary注释。带注释的@Primary类被认为是自动连线中的默认类。@Autowired注释加载@primary bean并向其添加接口或抽象变量

像这样更改代码。

@Component
@Primary    
@StepScope
public class GenericApprovalReader<T extends Process<U>, U> implements ItemReader<List<U>> {
//content
@Component
@Primary    
@StepScope
 GenericApprovalWriter<T extends Process<U>, U> implements ItemWriter<List<U>> {

//content
 类似资料:
  • 我已经浏览了http://docs.spring.io/spring-data/redis/docs/current/reference/html/,对我来说没有什么新内容。我想知道我错过了什么,我将感谢任何投入。 我使用Spring Data Redis 1.7.2.Release,Spring Boot 1.3.6.Release

  • 我通过Spring Boot 1.1.8使用Spring 4,并创建了一个类来缓存一些数据。这个类依赖于泛型来工作,但我在Spring和将这个类自动连接为另一个服务中的bean方面遇到了问题。 我会遇到如下错误: 所涉及的班级: 类BaseRepository扩展JpaRepository如下。其他实际存储库扩展了这个。 BaseWithName类是一个MappedSuperclass,它定义名称

  • 当试图用包含所有上下文配置的抽象类运行stepdefs时,spring看到2个不同的beans parent和step def 我使用的是Spring Booking版本:2.6.4,JUnit 5和Cucumber版本7.2.3 异常堆栈跟踪: io.cucumber.core.runtime.CucumberExecutionContext.runTestCase:没有可用的“Cucumber

  • 我尝试自动连接我的mapstruct mapper: 这是可行的: 但是为什么我不能使用: 我得到以下错误: 导致原因:org . spring framework . beans . factory . nosuchbeandidefinitionexception:没有类型为“pl . comp . window . application . mapper . windowdtomapper

  • 我的问题是:我有一个基本接口和两个实现类。 服务类依赖于基本接口,代码如下: 而配置是这样的: 服务类依赖于基础接口,将决定通过某些业务逻辑自动连接哪个实现。代码是这样的: 这个想法引发了一个例外:无法自动连线。有多个bean属于类型。 虽然可以使用@Qualifier来解决这个问题,但在这种情况下,我不能选择dependencies类。 我试图阅读spring文档,它提供了一个基于,但我仍然对这

  • 问题内容: 我正在尝试构建一个全新的Spring Framework 4.0项目,而没有所有神奇的东西,而只是简单地将它踢过去。 我在这里关注该教程:http : //spring.io/guides/tutorials/data/并取得了一些成功。我只是停留在这一点上。 当我运行此单元测试时,得到以下堆栈跟踪: 根据观察和研究,似乎是在告诉我有两个EntityManager类。第一个来自hibe