尝试使用通用实现注入两个存储库失败

时间:2016-01-15 14:08:02

标签: java spring generics dependency-injection javabeans

我正在尝试使用泛型来编写两个模型类的实现。

我有两个模型类:

@Entity
@Table(name = "SMS_INFO")
public class SmsInfo
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = Constants.ID_COLUMN)
    private Long smsInfoId;

    // other fields and public getters
}

类似的模型类适用于EmailInfo。

现在,对于这两个类,我尝试按如下方式创建通用存储库和服务类:

public interface InfoRepository <Info> extends JpaRepository<Info, Long> {}

public interface CommunicationInfoServiceI <Info>
{
    // Some abstract methods
}

@Named
public class CommunicationInfoServiceImpl<Info> implements CommunicationInfoServiceI<Info>
{
    @Inject
    private InfoRepository<Info> infoRepository;

    // Other implementations
}

现在,我正在尝试按如下方式注入两个服务:

@Named
@Singleton
public class ServiceFactory
{
    @Inject
    private CommunicationInfoServiceI<SmsInfo> smsInfoService;

    @Inject
    private CommunicationInfoServiceI<EmailInfo> emailInfoService;

    // Other Getter methods
}

但我收到以下错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serviceFactory': Injection of autowired dependencies failed; 
    nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private CommunicationInfoServiceI ServiceFactory.smsInfoService; 
    nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'communicationInfoServiceImpl': Injection of autowired dependencies failed; 
    nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private InfoRepository CommunicationInfoServiceImpl.infoRepository; 
    nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'infoRepository': Invocation of init method failed; 
    nested exception is java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object

任何人都可以帮助我,我被困在这里?

提前致谢。

  

注意:我已尝试删除所有通用类的注入并离开   InfoRepository就是这样,它仍然给出了同样的错误。我认为它   不应该是因为serviceFactory,它应该是应该做的事情   使用JPARepository,最初可能会尝试注入它   没有做到,因为JVM可能不知道&#39;信息&#39;类型。能够   我们为此做点什么?

2 个答案:

答案 0 :(得分:1)

如果您使用Guice进行注射,则应将接口绑定到Module配置中的实现类。如果使用spring上下文,则应在spring config中定义存储库bean。

答案 1 :(得分:0)

我能够通过为smsInfo和emailInfo创建一个更常见的父模型类来解决此问题,如下所示:

@MappedSuperclass
public class CommunicationInfo
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = Constants.ID_COLUMN)
    protected Long id;
}

并从SmsInfo和EmailInfo类扩展它。

之后我必须在存储库中使用extend以及泛型类型,如下所示:

public interface CommunicationInfoRepository <Info extends CommunicationInfo> extends JpaRepository<Info, Long>
{

}

在其他地方同样使用它。

感谢大家的回应。