2017-02-10 6 views
2

Elasticversion - 1.7.6 springboot - 1.3.5пружинными данных упругое поле Id не заполняется на чтение при использовании CustomEntityMapper

Использование пружинного данных-elasticsearch Я создал пользовательский JSON отображение, как рекомендуется в другом месте для того, для поддержки новых полей даты и времени Java8. Это прекрасно работает, но прерывает чтение объектов из репозитория, так как поле id больше не заполняется.

CustomConfig:

@Bean 
@Autowired 
public ElasticsearchTemplate elasticsearchTemplate(Client client) { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.registerModule(new JavaTimeModule()); 
    return new ElasticsearchTemplate(client, new CustomEntityMapper(objectMapper)); 
} 

public class CustomEntityMapper implements EntityMapper { 

    private ObjectMapper objectMapper; 

    public CustomEntityMapper(ObjectMapper objectMapper) { 
     this.objectMapper = objectMapper; 
     objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 
     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); 
    } 

    @Override 
    public String mapToString(Object object) throws IOException { 
     return objectMapper.writeValueAsString(object); 
    } 

    @Override 
    public <T> T mapToObject(String source, Class<T> clazz) throws IOException { 
     return objectMapper.readValue(source, clazz); 
    } 
} 

Пример Entity:

@Document(indexName = "scanner", type = "Entry") 
@Data 
@Builder 
@NoArgsConstructor 
@AllArgsConstructor 
public class Entry { 
    @Id 
    private String id; 

    @Field(type= FieldType.String) 
    private String path; 

    @Field(type = FieldType.Date, format = DateFormat.date_time) 
    private OffsetDateTime created; 

}

Примечание - что, когда я удалить CustomEntityMapper поле идентификатор возвращается. Я проследил код весны-данных-elasticsearch, и определил, что он не может разрешить поле Id из упругого отклика в DefaultResultMapper.setPersistentId с .

private <T> void setPersistentEntityId(T result, String id, Class<T> clazz) { 
     if (mappingContext != null && clazz.isAnnotationPresent(Document.class)) { 
      PersistentProperty<ElasticsearchPersistentProperty> idProperty = mappingContext.getPersistentEntity(clazz).getIdProperty(); 
      // Only deal with String because ES generated Ids are strings ! 
      if (idProperty != null && idProperty.getType().isAssignableFrom(String.class)) { 
       Method setter = idProperty.getSetter(); 
       if (setter != null) { 
        try { 
         setter.invoke(result, id); 
        } catch (Throwable t) { 
         t.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 

Неужели кто-нибудь испытал эту проблему? Как я могу поддерживать CustomEntityMapper без нарушения разрешения Id?

+0

Похоже, она была исправлена ​​в более поздних версиях https://jira.spring.io/browse/DATAES-141 – trorbyte

ответ

0

обновление до весны загрузки 1.4.1-RELEASE решен вопрос

 Смежные вопросы

  • Нет связанных вопросов^_^