0

我的 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() 等等......

我如何实现这一目标?

4

3 回答 3

0

按照您编写的代码,如果缺少任何注入,Spring 将在启动时引发异常。

您想要做的是动态模块加载,具体取决于您在问题中省略的条件。

您可能必须使用 XML 配置样式并按条件创建弹簧上下文并加载要使用的正确上下文。

干杯

于 2013-04-30T09:07:14.823 回答
0

似乎很简单,只有一个 if 语句:

if(object instanceof Temp1) {
    temp1Repo.save((Temp1) object);
} else if(object instanceof Temp2) {
    temp2Repo.save((Temp2) object);
}

或者,也许您正在寻找更通用的方法?

于 2013-04-29T23:05:17.947 回答
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直接使用,但无论如何可能有用......

于 2013-04-29T23:25:39.757 回答