我有大约5个对象,我想使用类似的事情。我发现,不要为代码提供策略,我会在一个地方为这些对象提供逻辑。
public class MetaObjectController<T extends MetaObject> {
@Autowired
private final MetaObjectRepository<T> repository;
// generic logic
这是存储库的外观:
public interface MetaObjectRepository<T extends MetaObject> extends GraphRepository<T> {
T findByName(String name);
}
现在,我创建了使用委托的具体类:
public class ExperimentalController {
@Autowired
private final MetaObjectController<MetaCategory> metaController;
@RequestMapping(method = RequestMethod.POST)
public void add(@RequestBody MetaCategory toAdd) {
metaController.add(toAdd);
}
现在,当我查看我看到的生成的查询时,尽管正确实例化,但存储库将MetaObject
作为实体名称而不是运行时类型。
是否有一种方法可以强迫存储库使用运行时类型?
请不要建议放置@Query
nnnotation。那不是我想要的。
这很可能是由于类型擦除而造成的:在运行时,只有类型约束是MetaObject
。如果要使用(通过春季)实际相关的子类,则必须创建MetaObjectRepository
的显式接口:
public class Transmogrifier extends MetaObject
public interface MetaTransmogrifierRepository
extends MetaObjectRepository<Transmogrifier> {}