Skip to content

Instantly share code, notes, and snippets.

@thetekst
Last active May 2, 2021 06:46
Show Gist options
  • Save thetekst/307e9c2c8d9657a8610c628dc2f2ce50 to your computer and use it in GitHub Desktop.
Save thetekst/307e9c2c8d9657a8610c628dc2f2ce50 to your computer and use it in GitHub Desktop.
Elasticsearch. Spring Boot 2. LocalDateTime converter for document's field. Data parser
package ru.tkachenko.app.config;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.RequiredArgsConstructor;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.EntityMapper;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* @author d.tkachenko
*/
@Configuration
@RequiredArgsConstructor
@EnableElasticsearchRepositories(basePackages = "ru/tkachenko/app/data/repository/elastic")
public class ElasticsearchConfig {
@Value("${elasticsearch.host}")
private String host;
@Value("${elasticsearch.port}")
private int port;
@Value("${spring.data.elasticsearch.cluster-name}")
private String clusterName;
@Bean
public Client client() throws UnknownHostException {
final var settings = Settings.builder()
.put("cluster.name", clusterName)
.put("client.transport.ignore_cluster_name", false)
.put("client.transport.sniff", true)
.build();
return new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName(host), port));
}
@Bean
public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {
return new ElasticsearchTemplate(client(), new ElasticCustomEntityMapper());
}
private class ElasticCustomEntityMapper implements EntityMapper {
private ObjectMapper mapper;
@Autowired
private ElasticCustomEntityMapper() {
this.mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.registerModule(new JavaTimeModule());
}
@Override
public String mapToString(Object object) throws IOException {
return mapper.writeValueAsString(object);
}
@Override
public <T> T mapToObject(String source, Class<T> clazz) throws IOException {
return mapper.readValue(source, clazz);
}
}
}
package ru.tkachenko.app.data.model.elastic;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import ru.tkachenko.app.data.model.db.HandbookType;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author d.tkachenko
*/
@Data
@ToString
@Document(indexName = "handbook", type = "handbook_type", shards = 1)
public class HandbookElastic implements Serializable {
private static final long serialVersionUID = -6953745395805907581L;
private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
@Id
private Long id;
private String name;
private HandbookType type;
// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_FORMAT)
// @Field(type = FieldType.Date, format = DateFormat.custom, pattern = DATE_FORMAT)
@Field(type = FieldType.Date)
private LocalDateTime created;
// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_FORMAT)
// @Field(type = FieldType.Date, format = DateFormat.custom, pattern = DATE_FORMAT)
@Field(type = FieldType.Date)
private LocalDateTime updated;
private Boolean readOnly;
}
package ru.tkachenko.app.data.repository.elastic;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import ru.tkachenko.app.data.model.elastic.HandbookElastic;
/**
* @author d.tkachenko
*/
public interface HandbookElasticRepository extends ElasticsearchRepository<HandbookElastic, Long> {
Page<HandbookElastic> findByName(String name, Pageable pageable);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment