Поддерживает ли Spring Data для ElasticSearch управление версиями документов через @Version? Кажется нет. Если не поддерживает, как это сделать правильно?
Пример:
ElasticSearchConfig:
@Configuration
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
String host = "localhost"; int port = 9200;
try {
System.out.println("ElasticSearch host: " + host + ", port: " + port);
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(host + ":" + port)
.build();
return RestClients.create(clientConfiguration).rest();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Объект:
@Document(indexName = Ent.INDEX_ENTITY, type = "_doc")
public class Ent {
public static final String INDEX_ENTITY = "entity";
@Id
public String id;
public String data;
public Ent(String data) {
this.data = data;
}
@JsonIgnore
public long version;
public Ent setData(String arg) {
this.data = arg;
return this;
}
}
Тестовое приложение :
@SpringBootApplication
public class App {
@Autowired
ObjectMapper objectMapper;
@Autowired
protected ElasticsearchOperations elasticsearchOperations;
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Autowired
EntRepository entRepository;
@PostConstruct
public void testUpdate() throws Exception {
Ent ent = entRepository.save(new Ent("some data"));
for (int i = 0; i < 3; i++) {
update(ent.setData("data-"+System.currentTimeMillis()));
System.out.println("version = " + ent.version);
}
}
public Ent update(Ent ent) throws JsonProcessingException {
UpdateQuery updateQuery = new UpdateQuery();
updateQuery.setIndexName(Ent.INDEX_ENTITY);
updateQuery.setId(ent.id);
updateQuery.setType("_doc");
updateQuery.setUpdateRequest(
new UpdateRequest()
.version(1)
.versionType(VersionType.EXTERNAL_GTE) // doesn't affect actually...
.doc(objectMapper.writeValueAsString(ent), XContentType.JSON)
);
UpdateResponse updateResponse = elasticsearchOperations.update(updateQuery);
ent.version = updateResponse.getVersion();
return ent;
}
}
Итак, я получаю вывод:
version = 2
version = 3
version = 4
, но он никогда не завершается ошибкой, хотя я установил новый UpdateRequest (). Version (1)
Так как сделать так, чтобы произошел сбой, если версия не соответствует ожидаемой (или ниже ожидаемой)?