'java.time' 인스턴스를 생성할 수 없습니다.LocalDate' - 스프링부츠, 엘라스틱시치, 잭슨
사용하고 있다Spring-boot 2.0.0.M7
그리고.spring-boot-starter-data-elasticsearch
그리고.elasticsearch 5
디시리얼라이즈하여 에러가 발생하였습니다.LocalDate
들판.
내 문서는 다음과 같습니다.
@Document(indexName= "myIndex", type = "cluster")
public class Cluster {
@Id
@Field
private Long id;
@Field
private String name;
@Field
private ClusterUrl clusterUrl;
@Field
private ClusterVisible clusterVisible;
}
여기서 ClusterVisible은 다음을 유지하는 하위 개체입니다.LocalDates
:
public class ClusterVisible {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
private LocalDate start;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
private LocalDate end;
}
하나의 클러스터 ID에 대해 쿼리를 작성하면 다음과 같은 예외가 발생합니다.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"id":12345,"name":"Cluster name ","clusterName":{"de":"Cluster de","it":null,"fr":null},"clusterUrl":{"de":"/url/results","it":null,"fr":null},"clusterVisible":{"start":{"year":2017,"month":"OCTOBER","dayOfMonth":9,"dayOfWeek":"MONDAY","era":"CE","dayOfYear":282,"leapYear":false,"mo"[truncated 252 chars]; line: 1, column: 388] (through reference chain: com.example.elasticsearch5.es.cluster.model.Cluster["clusterVisible"]->com.example.elasticsearch5.es.cluster.model.ClusterVisible["start"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1451)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1027)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1290)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992)
at org.springframework.data.elasticsearch.core.DefaultEntityMapper.mapToObject(DefaultEntityMapper.java:65)
잭슨의 의존관계를 추가해야 한다는 것은 이미 알고 있습니다.java.time api
그래서 덧붙였습니다.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
하지만 지금으로서는 도움이 되지 않는다.kibana를 사용하여 조회하여 인덱스의 엔트리를 확인하였습니다.쿼리 결과는 다음과 같습니다.
...
"clusterVisible": {
"start": {
"year": 2017,
"month": "OCTOBER",
"dayOfMonth": 25,
"dayOfWeek": "WEDNESDAY",
"era": "CE",
"dayOfYear": 298,
"leapYear": false,
"monthValue": 10,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
},
"end": {
"year": 3000,
"month": "JANUARY",
"dayOfMonth": 1,
"dayOfWeek": "WEDNESDAY",
"era": "CE",
"dayOfYear": 1,
"leapYear": false,
"monthValue": 1,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
}
}
이 오류를 수정하기 위해 놓칠 수 있는 것은 무엇입니까?
추가:정확한 오류는 에서 발생합니다.mapper.mapToObject
그래서 제가 만든 건new DefaultEntityMapper();
몇 줄 전에요.그게 문제일까요?
@Override
public Page<Cluster> findClustersAndScoreByText(String text) {
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.should(QueryBuilders.queryStringQuery(text).lenient(true).defaultOperator(Operator.OR)
.field("name")
.field("svno"));
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder)
.withPageable(PageRequest.of(0, 100)).build();
DefaultEntityMapper mapper = new DefaultEntityMapper();
ResultsExtractor<Page<Cluster>> rs = new ResultsExtractor<Page<Cluster>>() {
@Override
public Page<Cluster> extract(SearchResponse response) {
ArrayList<Cluster> hotels = new ArrayList<>();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
try {
Cluster cluster = mapper.mapToObject(hit.getSourceAsString(), Cluster.class);
cluster.setScore(hit.getScore());
hotels.add(cluster);
} catch (IOException e) {
e.printStackTrace();
}
}
return new PageImpl<>(hotels, PageRequest.of(0, 100), response.getHits().getTotalHits());
}
};
return elasticsearchTemplate.query(nativeSearchQuery, rs);
}
LocalDate 필드에 아래 주석을 추가합니다.
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate start;
날짜/시간 형식은 ISO 8601에 따라 "YYY-MM-DD"이므로 패턴은 다음과 같아야 합니다.
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
대신:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
다른 방법은 어플리케이션.yml에 추가하는 것입니다.
spring:
jackson:
serialization:
WRITE_DATES_AS_TIMESTAMPS: false
또는 오브젝트 맵퍼에서 직접 이 기능을 디세블로 합니다.
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
JsonFormat JsonDeserialize JsonSerialize를 설치해야 합니다.
private LocalDate dateOfBirth;
@PastOrPresent(message = "must be past time or present")
@Column(name = "date_of_birth", nullable = false, columnDefinition = "DATE")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
public LocalDate getDateOfBirth() {
return dateOfBirth;
}
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
필요없습니다@JsonFormat
필요한 건...DateFormat.date
주석 매개 변수(마모꼴):
@Field(type = Date, format = date)
val created: LocalDate = now()
Elastic Search는 Jackson이 아니라 Mapping Elastic Search Converter를 사용합니다.
날짜는 탄력적인 형식으로 저장됩니다.2020-01-02
, 매핑은 다음과 같습니다.
"created" : {
"type" : "date",
"format" : "date"
}
언급URL : https://stackoverflow.com/questions/48868034/cannot-construct-instance-of-java-time-localdate-spring-boot-elasticseach
'programing' 카테고리의 다른 글
플러그인 없이 수동으로 Wordpress에 AMP 페이지 추가 (0) | 2023.04.02 |
---|---|
org.springframework.cglib.core의 반사 액세스가 잘못되었습니다.리플렉트유틸스$1 (0) | 2023.04.02 |
사용자 지정 후크 반환 값을 시뮬레이션하려면 어떻게 해야 합니다. (0) | 2023.04.02 |
Spring Boot 로고를 Nyan Cat으로 변경하는 방법 (0) | 2023.04.02 |
ng-click을 사용하여 어레이에서 아이템 또는 오브젝트를 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.02 |