Skip to content

Auto configuration for data-elasticsearch does not configure mapper that can handle MapDocument payload #32906

@christophstrobl

Description

@christophstrobl

Using default data-elasticsearch auto configuration the mapper used to convert payloads is not configured to handle org.springframework.data.elasticsearch.core.document.MapDocument which leads to errors when adding data.

jakarta.json.JsonException: Cannot find a serializer for type org.springframework.data.elasticsearch.core.document.MapDocument. Consider using a full-featured JsonpMapper
	at co.elastic.clients.json.SimpleJsonpMapper.serialize(SimpleJsonpMapper.java:113) ~[elasticsearch-java-8.4.3.jar:na]
	at co.elastic.clients.json.JsonpUtils.serialize(JsonpUtils.java:146) ~[elasticsearch-java-8.4.3.jar:na]
	at co.elastic.clients.elasticsearch.core.IndexRequest.serialize(IndexRequest.java:290) ~[elasticsearch-java-8.4.3.jar:na]
	at co.elastic.clients.json.JsonpMapperBase$JsonpSerializableSerializer.serialize(JsonpMapperBase.java:111) ~[elasticsearch-java-8.4.3.jar:na]
	at co.elastic.clients.json.JsonpMapperBase$JsonpSerializableSerializer.serialize(JsonpMapperBase.java:108) ~[elasticsearch-java-8.4.3.jar:na]
	at co.elastic.clients.json.SimpleJsonpMapper.serialize(SimpleJsonpMapper.java:110) ~[elasticsearch-java-8.4.3.jar:na]
	at co.elastic.clients.transport.rest_client.RestClientTransport.prepareLowLevelRequest(RestClientTransport.java:214) ~[elasticsearch-java-8.4.3.jar:na]
	at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:145) ~[elasticsearch-java-8.4.3.jar:na]
	at co.elastic.clients.elasticsearch.ElasticsearchClient.index(ElasticsearchClient.java:946) ~[elasticsearch-java-8.4.3.jar:na]
	at org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate.lambda$doIndex$6(ElasticsearchTemplate.java:213) ~[spring-data-elasticsearch-5.0.0-RC1.jar:5.0.0-RC1]
	at org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate.execute(ElasticsearchTemplate.java:538) ~[spring-data-elasticsearch-5.0.0-RC1.jar:5.0.0-RC1]
	at org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate.doIndex(ElasticsearchTemplate.java:213) ~[spring-data-elasticsearch-5.0.0-RC1.jar:5.0.0-RC1]
	at org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate.save(AbstractElasticsearchTemplate.java:204) ~[spring-data-elasticsearch-5.0.0-RC1.jar:5.0.0-RC1]
	at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.lambda$save$5(SimpleElasticsearchRepository.java:172) ~[spring-data-elasticsearch-5.0.0-RC1.jar:5.0.0-RC1]
	at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.executeAndRefresh(SimpleElasticsearchRepository.java:344) ~[spring-data-elasticsearch-5.0.0-RC1.jar:5.0.0-RC1]
	at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.save(SimpleElasticsearchRepository.java:172) ~[spring-data-elasticsearch-5.0.0-RC1.jar:5.0.0-RC1]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

To work around this issue it is possible to provide ElasticsearchConfiguration as follows

@Configuration
static class Config extends ElasticsearchConfiguration {
	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.localhost(); // or any other config
	}
}

The above however has the downside, that it breaks when when configuration is created via AOT.

Field repository in com.example.data.elasticsearch.CLR required a bean named 'elasticsearchTemplate' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean named 'elasticsearchTemplate' in your configuration.

The behaviour can be reproduced using the data-elasticsearch sample from this fork. Just add/remove the configuration in DataElasticsearchApplication

@sothawo maybe you can help with more insights on required/default mapping configuration.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions