作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有三个具有名称和 ID 的 JPA 对象。我用 getters+setters 为 name 和 id 创建了一个接口(interface)。
class Car implements MetadataObject
class Bus implements MetadataObject
class Train implements MetadataObject
我们还有三个用于这些 JPA 对象的存储库:
interface CarRepository extends CrudRepository<Car, Long>
interface BusRepository extends CrudRepository<Bus, Long>
interface TrainRepository extends CrudRepository<Train, Long>
对于这些对象中的每一个,我们都希望在 spring 服务中运行相同的方法。 (高度简化)
private void importMetadata(CrudRepository<? extends MetadataObject, String> mRepository) {
Optional<? extends MetadataObject> currentOptional = mRepository.findById(1);
if (currentOptional.isPresent()) {
MetadataObject current = (MetadataObject) currentOptional.get();
current.setName("a1");
mRepository.save(current);
}
}
可由同一个 spring 服务调用
@Autowired
private CarRepository carRepository;
...
importMetadata(carRepository);
这会导致错误:
The method save(S) in the type CrudRepository<capture#4-of ? extends MetadataObject, Long> is not applicable for the arguments (MetadataObject)
如果我查看 Springs CRUD 存储库,这很奇怪:CrudRepository<T, ID>
及其保存方法:<S extends T> S save(S entity);
.
在我们的示例中,我们有 T = ? extends MetadataObject
和 S = ? extends ? extends MetadataObjects
.
如果我们将函数更改为 private void importMetadata(CrudRepository<MetadataObject, String> bdbRepository)
保存方法是正确的,但我不能再用我的 carRepository 调用该方法
The method importMetadata(CrudRepository<MetadataObject,String>) in the type <...> is not applicable for the arguments (CarRepository)
请注意:我高度简化了示例。我知道在此示例中,这些 JPA 类的接口(interface)毫无意义。我也知道我的方法没有意义,但它完美地突出了问题。
我的问题是:要传递什么来保存或如何重写它起作用的函数?这到底是什么问题?
最佳答案
你可以使用这个方法定义:
private void <T extends MetadataObject>importMetadata(CrudRepository<T, String> mRepository) {
Optional<T> currentOptional = mRepository.findById(1);
if (currentOptional.isPresent()) {
T current = currentOptional.get();
current.setName("a1");
mRepository.save(current);
}
}
关于java - 如何将泛型传递给 Spring CRUD 存储库的保存方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53776395/
我是一名优秀的程序员,十分优秀!