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

在泛型超类中自动关联泛型组件

公羊子真
2023-03-14

我在Spring 4.0(使用Spring Boot)环境中遇到以下情况:

映射界面:

public interface EntityModelMapper<ENTITY extends AbstractEntity, MODEL extends AbstractModel>{ }

映射实现:

@Component
public class ProductEntityModelMapper implements EntityModelMapper<Product, ProductModel>{ }

服务:

public interface CrudService<MODEL extends AbstractModel>{ }

我想做这样一个抽象的超类服务:

public abstract AbstractCrudService<ENTITY extends AbstractEntity, MODEL extends AbstractModel> implements CrudService<MODEL>{

@Autowired
private EntityModelMapper<ENTITY, MODEL> mapper;

  public EntityModelMapper<ENTITY, MODEL> getMapper(){ 
      return mapper; 
  }
}

所以我可以有如下实现:

@Service
public ProductCrudService extends AbstractCrudService<Product, ProductModel>{

  public void someMethod(Product product){
    ProductModel model = getMapper().map(product);
  }

}

但是Spring告诉我它找不到EntityModelMapper的合格bean来注入服务类。这种情况是可能的,我做错了什么,还是我在挑战Spring依赖注入的极限?

堆栈跟踪:

org.springframework.beans.factory.BeanCreationException:
 Error creating bean with name 'productCrudService':
 Injection of autowired dependencies failed;
 nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field:
 private com.flycatcher.seagull.mapper.EntityModelMapper 
com.flycatcher.seagull.facade.service.crud.AbstractCrudService.mapper;
 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
 No qualifying bean of type [com.flycatcher.seagull.mapper.EntityModelMapper] found for dependency:
 expected at least 1 bean which qualifies as autowire candidate for this dependency.
 Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

共有1个答案

诸嘉澍
2023-03-14

据此:https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics从Spring 4.0版本开始是可能的。

这对我也没用。(使用4.2.3时出现相同的异常和Im)。因此,请尝试升级到最新版本4.2.6。

如果仍然不起作用,您可以使用@Qualifier注释和autowire EntityModelMapper作为子类中的接口,并将getMapper定义为抽象:

  @Component
  @Qualifier("productEntityModelQualifier")
  public class ProductEntityModelMapper implements EntityModelMapper<Product, ProductModel>{ }

然后在ProductCrudService中:

@Service
public ProductCrudService extends AbstractCrudService<Product, ProductModel>{

  @Autowired
  @Qualifier("productEntityModelQualifier")
  EntityModelMapper<Product, ProductModel> mapper;

  @Override
  protected EntityModelMapper<Product, ProductModel> getMapper(){return mapper;}

  public void someMethod(Product product){
    ProductModel model = getMapper().map(product);
  }

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

  • “关联项”(associted items)是指一系列有关各种变量类型的 item(项) 的规则。它是 trait 泛型的扩展(extension),允许 trait 在内部定义新的项。 关联类型(associated type)就是这种项的其中一个。当 trait 在其容器类型(container type)上是泛型时,关联类型提供了更简单的使用模式。(原文:One such item is c

  • 这个问题是在泛型关联类型在Rust中可用之前提出的,尽管它们是被提出和开发的。 我的理解是,特征泛型和关联类型在它们可以绑定到结构的类型数量上有所不同。 关联类型仅绑定1个类型: 泛型关联类型是这两种类型的混合。它们绑定到一个类型,正好有一个关联的生成器,而生成器又可以关联任何数量的类型。那么前面示例中的和这个泛型关联类型有什么区别呢?

  • 对于一堆带有泛型的包装类,我的继承结构遇到了一些麻烦。这基本上是结构: 这将与当前代码一起编译和工作,但是,这似乎很危险。如果调用方像这样使用这个方法:,它将很好地编译,但是如果findMiddle尝试返回SubBWrapper,则在运行时会有一个ClassCastException。我以为行得通却行不通的是: 所以我的问题基本上是,有没有正确的方法来编写编译、运行并遵循最佳实践的方法findMi

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 我正在尝试创建一个泛型类型的数组。我收到错误消息: 我很困惑。任何线索为什么会这样。 问题答案: 其背后的原因是,您不能创建通用或参数化类型的数组,而只能 创建可验证的 类型(即可以在运行时推断出的类型)。 尽管可以将此类数组类型 声明 为变量或方法参数。这有点不合逻辑,但这就是Java的样子。 Java泛型和集合在第6章中广泛讨论了此问题和相关问题。