如何在没有_class属性的情况下使用带有couchbase的spring数据

问题描述 投票:4回答:3

是否有一种简单的方法可以将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"

java spring-data couchbase spring-data-couchbase
3个回答
5
投票

Spring数据通常需要_class字段来知道在反序列化时要实例化的内容。

通过覆盖_class中的typeKey()方法,在Spring Data Couchbase中使用与AbsctractCouchbaseDataConfiguration不同的字段名称相当容易。

但它仍然期望默认情况下在那里有完全限定的类名

绕过这将需要更多的工作:

  1. 你需要按照CouchbaseTypeMapper的模型实现自己的DefaultCouchbaseTypeMapper。在super(...)构造函数中,您需要提供一个额外的参数:TypeInformationMapper列表。默认实现没有明确地提供一个,所以使用了SimpleTypeInformationMapper,它是放置FQN的那个。
  2. 还有一个可配置的替代实现,因此您可以通过Map将特定类别名为更短的名称:ConfigurableTypeInformationMapper ...
  3. 因此,通过在列表中添加一个ConfigurableTypeInformationMapper和特定类别的别名+一个SimpleTypeInformationMapper(对于你没有提供别名的类序列化的情况),你可以实现你的目标。
  4. typeMapperMappingCouchbaseConverter中使用,不幸的是你还需要扩展(只是为了实例化你的typeMapper而不是默认值)。
  5. 完成后,再次覆盖配置以返回使用自定义MappingCouchbaseConverterCouchbaseTypeMapper方法)的自定义mappingCouchbaseConverter()实例。

1
投票

在您的couchbase配置类中,您只需要:

@Override
public String typeKey() {
    return "type";
}

不幸的是,对于查询派生(n1ql),_class或类型仍在使用类名.Tried spring couch 2.2.6并且它在这里是减号。 @Simon,您是否知道某些内容已发生变化,并支持在下一个版本中拥有自定义_class / type值?


1
投票

@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进行注释。

© www.soinside.com 2019 - 2024. All rights reserved.