我的spring MVC设置中的Service类和我的存储库类是这样的 -
public class ObjectServiceImpl implements ObjectService {
@Autowired
Temp1Repo temp1Repo;
@Autowired
Temp2Repo temp2Repo;
...
}
public interface Temp1Repo extends CrudRepository<Temp1, Integer> {
}
public interface Temp2Repo extends CrudRepository<Temp2, Integer> {
}
现在,在我的服务类中,我得到一个Temp1类型的对象,我必须调用temp1Repo.save()。如果我得到Temp2的对象,我必须调用temp2Repo.save()等等......
我如何实现这一目标?
答案 0 :(得分:0)
看起来很简单,只需要一个if语句:
if(object instanceof Temp1) {
temp1Repo.save((Temp1) object);
} else if(object instanceof Temp2) {
temp2Repo.save((Temp2) object);
}
或许您正在寻找更通用的方式?
答案 1 :(得分:0)
我想您想要将所有存储库重新组合在一个存储库中。像
这样的东西@SuppressWarnings("rawtypes")
public class ObjectServiceImpl {
@Autowired
private CrudRepository[] repositories;
private Map<Class<?>, CrudRepository> repositoryMap = new HashMap<Class<?>, CrudRepository>();
@PostConstruct
public void init() {
for (CrudRepository r : repositories)
repositoryMap.put(getType(r), r);
}
private Class<?> getType(CrudRepository repository) {
Type[] types = repository.getClass().getGenericInterfaces();
for (Type t : types) {
if (t instanceof ParameterizedType)
return (Class<?>) ((ParameterizedType) t).getActualTypeArguments()[0];
}
throw new IllegalStateException("Check repositories...");
}
public void save(Object entity) {
repositoryMap.get(entity.getClass()).save(entity);
}
public <T> T get(Object id, Class<T> clazz) {
return repositoryMap.get(clazz).findOne(id);
}
....
}
考虑直接使用EntityManager
,但无论如何都可能有用......
答案 2 :(得分:0)
根据您编写的代码,如果缺少任何注入,Spring将在启动时引发异常。
您要做的是动态模块加载,具体取决于您在问题中省略的条件。
您可能必须使用XML配置样式并创建一个条件弹簧上下文并加载要使用的正确的上下文。
干杯