是否有一种简单的方法可以将spring数据couchbase与没有_class
属性的文档一起使用?在沙发基地我在我的sampledata
桶中有这样的东西:
{
"username" : "alice",
"created" : 1473292800000,
"data" : { "a": 1, "b" : "2"},
"type" : "mydata"
}
现在,有没有办法定义从这个文档结构到Java对象的映射(请注意,_class
属性缺失且无法添加),反之亦然,以便从spring bedbase数据中获得所有(或大多数)自动化功能?
类似于:如果type
字段具有值“mydata”,则使用类MyData.java。所以当执行find而不是自动将AND _class = "mydata"
添加到生成的查询时添加AND type = "mydata"
。
Spring数据通常需要_class
字段来知道在反序列化时要实例化的内容。
通过覆盖_class
中的typeKey()
方法,在Spring Data Couchbase中使用与AbsctractCouchbaseDataConfiguration
不同的字段名称相当容易。
但它仍然期望默认情况下在那里有完全限定的类名
绕过这将需要更多的工作:
CouchbaseTypeMapper
的模型实现自己的DefaultCouchbaseTypeMapper
。在super(...)
构造函数中,您需要提供一个额外的参数:TypeInformationMapper
列表。默认实现没有明确地提供一个,所以使用了SimpleTypeInformationMapper
,它是放置FQN的那个。Map
将特定类别名为更短的名称:ConfigurableTypeInformationMapper
...ConfigurableTypeInformationMapper
和特定类别的别名+一个SimpleTypeInformationMapper
(对于你没有提供别名的类序列化的情况),你可以实现你的目标。typeMapper
在MappingCouchbaseConverter
中使用,不幸的是你还需要扩展(只是为了实例化你的typeMapper
而不是默认值)。MappingCouchbaseConverter
(CouchbaseTypeMapper
方法)的自定义mappingCouchbaseConverter()
实例。在您的couchbase配置类中,您只需要:
@Override
public String typeKey() {
return "type";
}
不幸的是,对于查询派生(n1ql),_class或类型仍在使用类名.Tried spring couch 2.2.6并且它在这里是减号。 @Simon,您是否知道某些内容已发生变化,并支持在下一个版本中拥有自定义_class / type值?
@SimonBasle在类N1qlUtils和方法createWhereFilterForEntity中,我们可以访问CouchbaseConverter。在线:
String typeValue = entityInformation.getJavaType().getName();
当我们想避免使用类名时,为什么不使用转换器中的typeMapper来获取实体的名称?否则,您必须按如下方式注释存储库中的每个方法:
@Query("#{#n1ql.selectEntity} WHERE `type`='airport' AND airportname = $1")
List<Airport> findAirportByAirportname(String airportName);
如果createWhereFilterForEntity使用CouchbaseConverter,我们可以避免使用@Query进行注释。