我正在Spring Boot中创建一个实用程序,用于以更通用的方式将数据连接和插入/插入数据到沙发床。
我有这样的东西:
console.log(company1);
我有public interface GenericRepository extends CouchbaseRepository<MyClass, String> {
}
的地方愿意接受任何类型的文件插入沙发床。
我尝试了一些类似使用通用类型T的操作,但是没有成功,因为出现以下错误:
由以下原因引起:org.springframework.data.mapping.MappingException:无法 找到类型类java.lang.Object的PersistentEntity!
我的结构是:服务(接口/ impl)> DAO(接口/ impl)>存储库
其他信息:在上述模型中,我传递了通用类型T。我使用带有MyClass
批注的Pojo调用服务。
目标是消除每种文档类型具有一个存储库类的“依赖性”。
答案 0 :(得分: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
}
带有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
但是请注意,文档将与BaseClass
这也不适用于一个以上的扩展名(例如MyClass1 extends Mid1
和Mid1 extends Base
)
答案 1 :(得分:1)
我认为通过Spring SDK(Couchbase只是实现Spring的规范)是不可能的。但是,您可以使用反射和标准Java SDK创建单个通用存储库:
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));