My Domain-Layer有几个ValueClasses,它们都扩展了AbstractValue类,这个AbstractValue类扩展了一个BaseEntity类。
public abstract class AbstractValue extends BaseEntity{}
public class Value extends AbstractValue{}
在我的Repository-Layer I中使用Spring-Data-Repositories,它将自动实现。就像在域层中一样,有某种AbstractValueRepository扩展了CrudRepository接口,还有一些ValueRepositories扩展了AbstractValueRepository。
@NoRepositoryBean
public interface AbstractValueRepository<T extends AbstractValue> extends CrudRepository<T, Long> {}
public interface ValueRepository extends AbstractValueRepository<Value>
在我的业务层中,我有一个ValueService接口,其中包含一些方法和实现类,以及列出所有可用ValueRepositories的枚举。
public enum ValueType {
VALUE(ValueRepository.class),
VALUE1(Value1Repository.class),
VALUE2(Value2Repository.class),
VALUE3(Value3Repository.class),
;
private final Class<? extends AbstractValueRepository<? extends AbstractValue>> repository;
ValueType(final Class<? extends AbstractValueRepository<? extends AbstractValue>> repository) {
this.repository = repository;
}
public Class<? extends AbstractValueRepository<? extends AbstractValue>> getRepository() {
return repository;
}
}
@Service
public class ValueServiceImpl implements ValueService {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private ApplicatieRepository applicatieRepository;
@Override
public <S extends AbstractValueType> S updateValueForType(ValueType type, S value) {
return applicationContext.getBean(type.getRepository()).save(value);
}
@Override
public <S extends AbstractValueType> S createValueForType(ValueType type, S value) {
return applicationContext.getBean(type.getRepository()).save(value);
}
}
现在的问题是,类型S的值扩展AbstractValueType的save方法不存在。 CrudRepository就是这样做的。
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S var1);
}
因此,基本上save方法需要从存储库中给出的Type扩展的类型的值,在ValueRepository的情况下是Value(扩展AbstractValue),但在Service中,save方法使用Type S扩展AbstractValue。我一直在寻找修复工具以使其工作,我认为它有点像这样(虽然这种语法是错误的)
@Override
public <S extends AbstractValueType> S updateValueForType(ValueType type, T <? extends S> value) {
return applicationContext.getBean(type.getRepository()).save(value);
}
虽然这不正确但我觉得这就是我需要搜索的方向。任何帮助都会受到赞赏,非常感谢。