当前位置: 首页 > 知识库问答 >
问题:

使用spring boot的couchbase存储库的泛型类型

景哲
2023-03-14

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

我有这样的东西:

public interface GenericRepository extends CouchbaseRepository<MyClass, String> {
}

在我有MyClass的地方,我想接受任何类型的文档插入沙发底座。

我尝试过一些方法,比如使用泛型类型T,但没有成功,因为我遇到了以下错误:

原因:org。springframework。数据地图。MappingException:找不到类型类java的PersistentEntity。朗,反对!

我的结构是:服务(接口/impl)

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

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

共有2个答案

王翰墨
2023-03-14

UPDATE:您可以构建一个类,通过Couchbase操作类对实体进行通用操作(保存/删除/更新)。您所需要做的就是将它注入到您的服务或自定义存储库中。

我认为这不可能通过SpringSDK(Couchbase只是实现Spring的规范)。但是,您可以使用反射和标准JavaSDK创建一个通用存储库:

    Cluster cluster = CouchbaseCluster.create("localhost");
    cluster.authenticate("username", "password");
    Bucket bucket = cluster.openBucket("bucketname");

    // Create a JSON Document
    JsonObject arthur = JsonObject.create()
        .put("name", "Arthur")
        .put("email", "kingarthur@couchbase.com")
        .put("interests", JsonArray.from("Holy Grail", "African Swallows"));

    // Store the Document
    bucket.upsert(JsonDocument.create("u:king_arthur", arthur));
郎魁
2023-03-14

您可以拥有通用存储库(有点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
}

使用BaseClass

@Document
public class BaseClass { 

    private Type type;

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

    public enum Type {
        MyClass1, MyClass2
    }
}

然后您可以拥有以下存储库;

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());
    }
}

像这样使用它;

@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()));
}

将打印出来;

text1
text2

但是请注意,这些文档都将位于基类的集合

此外,这也不能用于多个扩展(例如MyClass1扩展Mid1,以及Mid1扩展Base

 类似资料:
  • 问题内容: 我有许多需要保留到数据库的简单对象类型。我正在使用Spring JPA来管理这种持久性。对于每种对象类型,我需要构建以下内容: 在我看来,有可能用三个基于泛型的类替换每种对象类型的多个类,从而节省了大量的样板代码。我不确定该怎么做,实际上,如果这是个好主意? 问题答案: 首先,我知道我们在这里提高了一些标准,但这已经比没有Spring Data JPA的帮助而编写的代码少得多。 其次,

  • 主存储库文件 ==================================自定义存储库 ============================================ 定制回购方法的实现 ===================================================== 服务等级 在myRepository上遇到异常请考虑定义一个myRepository类

  • 我突然想到,可以用三个基于泛型的类来替换每个对象类型的多个类,从而节省大量的样板代码。我不是很清楚该怎么做,事实上这是不是一个好主意?

  • 我有很多实体扩展了实体,也有很多数据扩展到 我有一个通用的存储库、服务和映射器,如下所示 我的仓库: 我的服务: 我的地图绘制者: 我想在方法中从T创建一个对象,在类中从方法中从Dto创建一个对象

  • 问题内容: 假设我必须创建一个存储ArrayList的Integers数组,并且数组大小为10。 下面的代码可以做到这一点: 问题1: 我认为更合适的代码是 为什么这不起作用? 问题2: 下面两个都编译 有什么区别尽可能的引用声明和关注? 问题答案: 问题1: 基本上,这是Java语言禁止的。Java语言规范中的泛型部分对此进行了介绍。 使用时 您会收到编译器警告,因为以下示例将进行编译(为每行代

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或