我正在尝试使用泛型来编写两个模型类的实现。
我有两个模型类:
@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;类型。能够 我们为此做点什么?
答案 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>
{
}
在其他地方同样使用它。
感谢大家的回应。