Spring Boot 2.2.0中Spring Batch的UserRepository.save方法编译错误
解决Spring Batch中JpaRepository.save(List)的编译错误
我帮你分析下这个问题哈,你遇到的编译错误是因为JpaRepository的批量save方法对类型参数有约束,而你传入的List<? extends User>让编译器没法正确推断出符合要求的类型。
问题原因拆解
先看JpaRepository继承的CrudRepository里的批量save方法签名:
<S extends T> List<S> save(Iterable<S> entities);
这里的泛型约束要求S必须是User(也就是T)的子类或本身。但你在DBWriter的write方法里传入的是List<? extends User>,这个通配符表示“某个继承自User的未知类型的列表”,编译器没法确定这个未知类型到底是不是符合S extends User的约束(虽然逻辑上肯定符合,但编译器不认),所以就抛出了类型推断错误。
两种可行的解决方案
方案1:修改write方法的参数类型
直接把write方法的参数从List<? extends User>改成List<User>,这样编译器能明确知道传入的是User类型的列表,完全符合JpaRepository的泛型要求:
@Component public class DBWriter implements ItemWriter<User> { @Autowired private UserRepository userRepository ; @Override public void write(List<User> users) throws Exception { System.out.println("Data saved for users: "+ users); userRepository.save(users); } }
这种方式最直接,也符合Spring Batch的使用场景——因为你从CSV读取的就是User对象,不会有它的子类,所以参数用List<User>完全没问题。
方案2:对列表进行类型强转
如果你不想修改方法参数类型,可以把List<? extends User>强转为List<User>,前提是你能确保实际传入的列表里的元素都是User实例(这在你的业务场景里肯定是成立的):
@Component public class DBWriter implements ItemWriter<User> { @Autowired private UserRepository userRepository ; @Override public void write(List<? extends User> users) throws Exception { System.out.println("Data saved for users: "+ users); // 强转后编译器能识别出正确的类型 userRepository.save((List<User>) users); } }
这两种方法都能解决你遇到的编译错误,选哪种看你的代码习惯就行~
内容的提问来源于stack exchange,提问作者Linux
相关产品推荐
相关产品推荐

