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

Spring 4 bean与泛型的自动连接

宋望
2023-03-14

我通过Spring Boot 1.1.8使用Spring 4,并创建了一个类来缓存一些数据。这个类依赖于泛型来工作,但我在Spring和将这个类自动连接为另一个服务中的bean方面遇到了问题。

我会遇到如下错误:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [orm.repository.BaseRepository] is defined: expected single matching bean but found 2: dataTypeRepository,propertyNameRepository

所涉及的班级:

/**
 * The purpose of this class is to get data from a cache backed by a database 
 * and if it does not exist to create it and insert into the database.
 */
@Service
public class CacheByName<TRepo extends BaseRepository, TItem extends BaseWithName> {
    private final TRepo repo;
    private final Class<TItem> itemClass;
    private final Map<String, TItem> itemsCache; // TODO: change to better caching strategy

    @Autowired
    public CacheByName(TRepo repo, Class<TItem> itemClass) {
        this.repo = repo;
        this.itemClass = itemClass;
        itemsCache = new HashMap();
    }

    public TItem getCreateItem(String name) {
        TItem item = null;
        if(itemsCache.containsKey(name)) {
            item = itemsCache.get(name);
        } else {
            // try and load from db
            item = (TItem) repo.findByName(name);
            if(item == null) {
                try {
                    item = itemClass.newInstance();
                    item.setName(name);
                    repo.saveAndFlush(item);
                } catch (InstantiationException | IllegalAccessException ex) {
                    // TODO: log and handle better
                    return null;
                }

            }
            itemsCache.put(name, item);
        }

        return item;
    }
}

类BaseRepository扩展JpaRepository如下。其他实际存储库扩展了这个。

@NoRepositoryBean
public interface BaseRepository<T extends Object, ID extends Serializable> extends JpaRepository<T, ID> {
    public T findByName(String name);
}

BaseWithName类是一个MappedSuperclass,它定义名称属性及其getter/setter。其他更具体的实体类扩展了这一点。

我正在尝试将CacheByName类注入到另一个服务中,如下所示。注意,我在构造函数中将实际的存储库和实体类定义为泛型:

@Service
public class DataImporter extends BaseImporter {
    private static final Logger log = LoggerFactory.getLogger(PropertyImporter.class);
    private final PropertyNameRepository propertyNameRepo;
    private final CacheByName<DataTypeRepository, DataType> dataTypeCache; 


    @Autowired
    public PropertyImporter(RestTemplate restTemplateD5,
                            CacheByName<DataTypeRepository, DataType> dataTypeCache) {
        super(restTemplateD5);
        this.dataTypeCache = dataTypeCache;
    }

    .
    .
    .
}

我的AppConfig。java如下所示:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class AppConfig {
    @Value("${username}")
    private String username;
    @Value("${password}")
    private String password;

    @Bean
    public RestTemplate restTemplateD5() {
        return RestTemplateFactory.createWithHttpBasicAuth(username, password);
    }
}

我还没有找到关于创建使用泛型的bean的更多信息。我怀疑我需要在AppConfig中创建另一个@Bean定义,但我无法实现任何有效的东西。

共有1个答案

季稳
2023-03-14

由于BaseRepository也是泛型类型,我认为您没有在那里添加泛型类型。这将有助于Spring找到合适的bean进行注入:

public class CacheByName<TRepo extends BaseRepository<TItem, ? extends Serializable>, TItem extends BaseWithName>

这也应使演员不再需要:

item = repo.findByName(name);
 类似资料:
  • 我试图解析spring Version4.3.6中FactoryBean中的泛型类型。我使用FactoryBean创建bean,该bean用于创建任意数量的CarClient实例。 通过构造函数参数1表示的不满足依赖关系;嵌套异常是org.springframework.beans.factory.nouniqueBeanDefinitionException:没有类型为“com.empire.c

  • 可以自动绑定泛型类吗?考虑一下: 通用接口: 长子类型: 字符串子类型: 自定义模块:公共类CustomModule扩展AbstractModule{ } 主要的 是否可以以某种方式(例如:基抽象类、反射或其他)自动绑定

  • 我在Spring 4.0(使用Spring Boot)环境中遇到以下情况: 映射界面: 映射实现: 服务: 我想做这样一个抽象的超类服务: 所以我可以有如下实现: 但是Spring告诉我它找不到EntityModelMapper的合格bean来注入服务类。这种情况是可能的,我做错了什么,还是我在挑战Spring依赖注入的极限? 堆栈跟踪:

  • 我是Spring的新手,我正在尝试自动连接一个通用DAO。不幸的是,我遇到了一个错误。我试图根据它搜索信息,但大多数解决方案都声明使用@Qualifier注释,我认为这与我想要实现的目标背道而驰。 所以下面的一些代码(我将摆脱类参数,一旦我处理当前问题): 道 服务 和下面抛出的错误:

  • 两者之间有什么区别

  • 我正在使用Swing和Spring创建一个金融应用程序。在应用程序的一部分中,我有一个,其中包含应用程序中每个的。单击时,我希望在中显示类型的。这都是在下面的控制器中执行的。 会为每个点击更改,因此我将设置为一个原型bean,因此我将为每个帐户接收一个新实例。为了使原型作用域工作,我需要使用。以下是代码: 您将注意到我试图自动连接类型的bean。但是,该bean没有正确地自动连接,它是空的。以下是