使用Spring Boot的Couchbase的通用类型库

Fab*_*oso 6 java generics couchbase spring-boot spring-data-couchbase

我在Spring Boot中创建了一个实用程序,用于以更通用的方式将数据连接和插入/添加到沙发床中。

我有这样的事情:

public interface GenericRepository extends CouchbaseRepository<MyClass, String> {
}
Run Code Online (Sandbox Code Playgroud)

在那里我有MyClass我愿意接受任何形式的文件插入到couchbase。

我尝试了一些类似使用通用类型T的操作,但没有成功,因为出现以下错误:

原因:org.springframework.data.mapping.MappingException:找不到类型类java.lang.Object的PersistentEntity!

我的结构是:服务(接口/ Impl)> DAO(接口/ Impl)>存储库

额外信息:在上述模型中,我传递了通用类型T。我通过带有@Document注释的Pojo调用服务。

目标是消除每种文档类型具有一个存储库类的“依赖性”。

bur*_*ete 2

您可以拥有通用存储库(有点hacky),但有一些限制。假设您有文件;

@Document
public class MyClass1 extends BaseClass {

    private String text1;

    public MyClass1() {
        super();
        setType(Type.MyClass1);
    }

    // getter/setters
}

@Document
public class MyClass2 extends BaseClass {

    private String text2;

    public MyClass2() {
        super();
        setType(Type.MyClass2);
    }

    // getter/setters
}
Run Code Online (Sandbox Code Playgroud)

BaseClass;

@Document
public class BaseClass { 

    private Type type;

    // other common fields if any, and getter/setters

    public enum Type {
        MyClass1, MyClass2
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以拥有以下存储库;

public interface GenericRepository<T extends BaseClass> extends CouchbaseRepository<T, String> {

    public List<T> findByType(BaseData.Type type);

    public default List<T> findAll(Class<T> clazz) throws IllegalAccessException, InstantiationException {
        return findByType(clazz.newInstance().getType());
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它;

@Autowired
private GenericRepository<MyClass1> mc1Repository;
@Autowired
private GenericRepository<MyClass2> mc2Repository;

public void doStuff() {
    MyClass1 myClass1 = new MyClass1();
    myClass1.setText1("text1");
    mc1Repository.save(myClass1);
    mc1Repository.findAll(MyClass1.class).forEach(d -> System.out.println(d.getText1()));

    MyClass2 myClass2 = new MyClass2();
    myClass2.setText2("text2");
    mc2Repository.save(myClass2);
    mc2Repository.findAll(MyClass2.class).forEach(d -> System.out.println(d.getText2()));
}
Run Code Online (Sandbox Code Playgroud)

将打印出来;

text1
text2
Run Code Online (Sandbox Code Playgroud)

但请注意,这些文档将全部位于同一个集合中,该集合是BaseClass

此外,这不适用于多个扩展(例如MyClass1 extends Mid1, 和Mid1 extends Base