java - Spring + Mongo + 泛型 + 灵活性

标签 java spring generics mongodb

以下代码不起作用(当然),因为标记的行无法编译:

MyClass {
    //singleton stuff
    private static MyClass instance;
    private MyClass () {}
    public static MyClass getInstance() {
        if(instance==null) {
            instance = new MyClass ();
        }
        return instance;
    }

    // method creating problems
    public NonGenericSuperClassOfGenericClass create(Class<?>... classes) {
        if(someCondition)
             return new GenericClass<classes[0],classes[1]>; // DOES NOT COMPILE
        else
             return new OtherGenericClass<classes[0]>;
    }
}

因此,我其实不知道“create”是否会返回

GenericClass<classes[0],classes[1]>

OtherGenericClass<classes[0]>

具有不同数量的参数。

发生这种情况是因为我正在使用Spring并且我计划使用MongoDB,但将来我可能需要切换到不同的东西(例如Hibernate)。

类 GenericClass 类似于:

 GenericClass<PersistetType1, Long> 

 GenericClass<PersistentType2, Long>

其中 PersistentType1/2 是我最终需要存储在数据库中的类,而 GenericClass 是一种访问 Mongo API 的代理。事实上,它看起来像:

  public MongoTemplate getTemplate();
  public void save(T toInsert);
  public List<T> select(Query selectionQuery);
  public T selectById(ID id);
  public WriteResult update(Query selectionQuery, Update updatedAttributes);
  public void delete(T toRemove);
  public void delete(Query selectionQuery);

现在,什么? 从 Controller (或实体,如果你很挑剔)我需要实例化存储库并调用任何方法。这导致 Controller 与 MongoDB 耦合,即它们必须显式实例化这样的 GenericClass,它实际上称为 MongoRepository,并且严格依赖于 Mongo(实际上它是一个具有恰好两个“自由度”的泛型)。

因此,我决定创建 MyClass,这是隔离 Controller 的进一步代理。通过这种方式,Controller 可以获得 MyClass 的单个实例,并让它创建适当存储库的新实例。特别是,当“somecondition”为 true 时,意味着我们想要使用 MongoRepository(当为 false 时,可能需要实例化一个 Hibernate 代理,即 HibernateRepository)。然而,MongoRepository 是通用的,因此它需要某种形式的实例化,我希望将其作为参数传递。

不幸的是,泛型是在编译时解析的,因此我猜它们对我不起作用。

我该如何解决这个问题?

最佳答案

为了将底层持久性存储与应用程序逻辑分离,我将使用 DAO 方法。

使用所需的方法定义 DAO 的接口(interface),例如然后为您可能需要的每个持久性提供程序提供一个实现,例如 UserAccess 可能是您可以实现为 HibernateUserAccess 和 MongoUserAccess 的接口(interface)。在每个实现中,您注入(inject)适当的模板,例如Mongo或Hibernate并使用它来完成持久化操作。

您可能遇到的问题是您的加载操作将返回 User 实例,这需要根据持久性提供程序而有所不同,即 JPA 注释将与 MongoDB 所需的 Spring Data 注释不同(泄漏抽象)。

我可能会通过创建一个用户界面来表示持久性操作的结果并为每个持久性提供程序提供一个实现来解决这个问题。或者返回一个您根据 JPA 或 Mongo 加载结果构建的通用模型。

关于java - Spring + Mongo + 泛型 + 灵活性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267441/

相关文章:

java - 如何使用传入的通用对象列表并通过 Java 方法返回通用对象?

java - 如何用 Java 编写异常工厂

Spring MVC 在 select 标签中保留选定的值

java - Spring mvc 项目中的 org.springframework.beans.factory.CannotLoadBeanClassException

java - Grails 与 Spring

JavaFX FilteredList 泛型 getPredicate()

java - 将字符串转换为 Joda DateTime 对象时出现问题

java - Mvn test 正确执行所有测试但是 mvn DTest 给出错误

java - Vaadin 中图表配置的序列化

java - 从泛型 ArrayList 派生泛型类型