8
回答
spring-data-jpa中使用泛型JpaRepository<T,ID>注入失败?
终于搞明白,存储TCO原来是这样算的>>>   
首先,我用interface BaseRepository extends JpaRepository<User,Integer>然后我在我的test放在中用
@Autowired
private BaseRepository baseRepository获取该bean,然后成功进行了CURD

但是当我把接口改成interface BaseRepository<T,ID> extendsJpaRepository<T,ID>
@Autowired
private BaseRepository<User,Integer> baseRepository进行curd操作报错
java.lang.IllegalStateException: Failed to load ApplicationContext
at 。。。。。。。。。。
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object

然后有人提议在repsitory上加

@NotBeanRepository

但是还是报错


<无标签>
举报
小昭归来
发帖于3年前 8回/6K+阅
共有8个答案 最后回答: 2年前
不难想的,spring在加载的时候,扫描类(或接口),组装bean,第二种在扫描到BaseRepository时,不知道如何组装的,是个泛型,你是在将其注入到别的bean中才指定泛型参数,依赖注入是将对象自动注入到依赖的对象里面去,现在没bean能注入。

引用来自“guor”的评论

不难想的,spring在加载的时候,扫描类(或接口),组装bean,第二种在扫描到BaseRepository时,不知道如何组装的,是个泛型,你是在将其注入到别的bean中才指定泛型参数,依赖注入是将对象自动注入到依赖的对象里面去,现在没bean能注入。

哦,您说的大体上明白了,spring先扫描再注入,扫描时那个接口还是泛型,无法实现注入。

那我该怎么解决用泛型接口而不必每个实体都要对应写个接口的问题呢?

下面是“涛哥”网上es开源工程,有这样一段,我该如何理解呢?真心求指教

引用来自“guor”的评论

不难想的,spring在加载的时候,扫描类(或接口),组装bean,第二种在扫描到BaseRepository时,不知道如何组装的,是个泛型,你是在将其注入到别的bean中才指定泛型参数,依赖注入是将对象自动注入到依赖的对象里面去,现在没bean能注入。

引用来自“小昭归来”的评论

哦,您说的大体上明白了,spring先扫描再注入,扫描时那个接口还是泛型,无法实现注入。

那我该怎么解决用泛型接口而不必每个实体都要对应写个接口的问题呢?

下面是“涛哥”网上es开源工程,有这样一段,我该如何理解呢?真心求指教

这个BaseSerive是抽象类,这里的Autowired注入,实际上是子类的一个实现,你debug就会发现,注入的是实现,而且这里不是定义bean,不存在你上面的情况,初始化一个泛型,这里是注入。
--- 共有 1 条评论 ---
小昭归来无论在哪里BaseRepository只是一个接口注入的都是实现吧,关键是在这里组装时是要BaseRepository<User,Long>的实现,而扫描类的时候只有一个泛型接口BaseRepository<M,ID>,而此时也不能根据泛型生成响应的实现,来完成BaseRepository<User,Long>的组装呀 3年前 回复
我大概明白了,利用泛型注入的时候也必须要写出响应的接口,比如
@Autowired
private BaseRepository<User,Long> br;
必须要有interface BaseRepository<User,Long>...才可以
只有interface BaseRepository<T,ID>不可以,是这样吗

如果是这样的话,其实和传统模式也只是少写了各个接口的实现类而已,接口还是要自己去写出来。原来以为只写一个泛型通用接口在你@Autowired的时候会根据写入的内容自动生成响应的bean呢

引用来自“guor”的评论

不难想的,spring在加载的时候,扫描类(或接口),组装bean,第二种在扫描到BaseRepository时,不知道如何组装的,是个泛型,你是在将其注入到别的bean中才指定泛型参数,依赖注入是将对象自动注入到依赖的对象里面去,现在没bean能注入。

引用来自“小昭归来”的评论

哦,您说的大体上明白了,spring先扫描再注入,扫描时那个接口还是泛型,无法实现注入。

那我该怎么解决用泛型接口而不必每个实体都要对应写个接口的问题呢?

下面是“涛哥”网上es开源工程,有这样一段,我该如何理解呢?真心求指教

引用来自“guor”的评论

这个BaseSerive是抽象类,这里的Autowired注入,实际上是子类的一个实现,你debug就会发现,注入的是实现,而且这里不是定义bean,不存在你上面的情况,初始化一个泛型,这里是注入。
我大概明白了,利用泛型注入的时候也必须要写出响应的接口,比如
@Autowired
private BaseRepository<User,Long> br;
必须要有interface BaseRepository<User,Long>...才可以
只有interface BaseRepository<T,ID>不可以,是这样吧

如果是这样的话,其实和传统模式也只是少写了各个接口的实现类而已,接口还是要自己去写出来。原来以为只写一个泛型通用接口在你@Autowired的时候会根据写入的内容自动生成响应的bean呢

引用来自“guor”的评论

不难想的,spring在加载的时候,扫描类(或接口),组装bean,第二种在扫描到BaseRepository时,不知道如何组装的,是个泛型,你是在将其注入到别的bean中才指定泛型参数,依赖注入是将对象自动注入到依赖的对象里面去,现在没bean能注入。

引用来自“小昭归来”的评论

哦,您说的大体上明白了,spring先扫描再注入,扫描时那个接口还是泛型,无法实现注入。

那我该怎么解决用泛型接口而不必每个实体都要对应写个接口的问题呢?

下面是“涛哥”网上es开源工程,有这样一段,我该如何理解呢?真心求指教

引用来自“guor”的评论

这个BaseSerive是抽象类,这里的Autowired注入,实际上是子类的一个实现,你debug就会发现,注入的是实现,而且这里不是定义bean,不存在你上面的情况,初始化一个泛型,这里是注入。

引用来自“小昭归来”的评论

我大概明白了,利用泛型注入的时候也必须要写出响应的接口,比如
@Autowired
private BaseRepository<User,Long> br;
必须要有interface BaseRepository<User,Long>...才可以
只有interface BaseRepository<T,ID>不可以,是这样吧

如果是这样的话,其实和传统模式也只是少写了各个接口的实现类而已,接口还是要自己去写出来。原来以为只写一个泛型通用接口在你@Autowired的时候会根据写入的内容自动生成响应的bean呢

是的撒,你想啊,一个普通接口,可以通过字节码工具包生成其实现类,没问题的,但是泛型接口,怎么能生成得了呢?连类型都没有.

退一万步说,即使不同的业务公用一个Repository可行,也不能这么干啊,A、B、C等Repository都用通用的,那对A添加的业务方法,对B、C也是可见的,那调用岂不乱套了.

顶部