2016-03-10 3 views
0

У меня возникла очень странная проблема, я в основном пытаюсь сохранить объект в упругом поиске с помощью пружинных ботинков и репозиториев, и по каким-то причинам мои объекты никогда не сохраняются.Весенний эластичный поисковый репозиторий не хранит данные

Это делается, с помощью Scala

случай класс:

@Document(collection = "SPECTRUM") 
     @org.springframework.data.elasticsearch.annotations.Document(indexName = "spectrum", `type` = "spectrum", shards = 1, replicas = 0, refreshInterval = "-1") 
    case class Spectrum(
        @([email protected])(`type` = FieldType.Nested) 
        biologicalCompound: Compound, 
        @([email protected])(`type` = FieldType.Nested) 
        chemicalCompound: Compound, 
        @([email protected])(`type` = FieldType.Nested) 
        predictedCompound: Compound, 
        @(Indexe[email protected]) 
        deleted: Boolean, 
        @([email protected]) 
        id: String, 
        lastUpdated: String, 
        @([email protected])(`type` = FieldType.Nested) 
        metaData: Array[MetaData], 
        score: Score, 
        spectrum: String, 
        splash: Splash, 
        submitter: Submitter, 
        @([email protected])(`type` = FieldType.Nested) 
        tags: Array[Tags], 
        @([email protected])(`type` = FieldType.Nested) 
        authors: Array[Author] 
       ) 

} 

хранилище

@Repository("spectrumElasticRepository") 
trait ISpectrumElasticRepositoryCustom extends ElasticsearchRepository[Spectrum, String] with  SpectrumElasticRepositoryCustom{  
    def findByBiologicalCompoundInchiKey(inchiKey: String) : java.util.List[Spectrum] 
} 

тестовый код

getRepository.deleteAll() 
    assert(getRepository.count() == 0) 

     s"we should be able to store our data" in { 
     for (spectrum <- exampleRecords) { 
      val result = getRepository.save(spectrum) 
      assert(result.isInstanceOf[Spectrum]) 
     } 

    assert(getRepository.count() == 58) 

     val data:Iterable[Spectrum] = getRepository.findAll() 
     } 

раз тестовый код попадет эту строку

  val data:Iterable[Spectrum] = getRepository.findAll() 

это вызывает следующее исключение

failed to map source [ {}] to class Spectrum 
org.springframework.data.elasticsearch.ElasticsearchException: failed to map source [ {}] to class Spectrum 

и глядя на упругий поисковом сервере непосредственно

localhost:9200/spectrum/_search 

это выглядит как нет данные фактически привязаны к любому из сообщенных хитов

{ 
    "_index": "spectrum", 
    "_type": "spectrum", 
    "_id": "AVNhcpHjnm4IHnHomcXj", 
    "_score": 1, 
    "_source": {} 
    }, 

поскольку источник пуст.

любые идеи, что вызывает это?

ответ

1

Это похоже на scala.

После того, как он гарантировал, что каждое свойство хранить в упругом поисковой базе данных индексируется с

@BeanProperty

как здесь

@Document(collection = "SPECTRUM") 
    @org.springframework.data.elasticsearch.annotations.Document(indexName = "spectrum", `type` = "spectra", shards = 1, replicas = 0, refreshInterval = "-1") 
    case class Spectrum(
        @BeanProperty 
        @([email protected])(`type` = FieldType.Nested) 
        biologicalCompound: Compound, 
        @BeanProperty 
        @([email protected])(`type` = FieldType.Nested) 
        chemicalCompound: Compound, 
        @BeanProperty 
        @([email protected])(`type` = FieldType.Nested) 
        predictedCompound: Compound, 
        @BeanProperty 
        @([email protected]) 
        deleted: Boolean, 
        @BeanProperty 
        @([email protected]) 
        id: String, 
        lastUpdated: String, 
        @BeanProperty 
        @([email protected])(`type` = FieldType.Nested) 
        metaData: Array[MetaData], 
        @BeanProperty 
        score: Score, 
        @BeanProperty 
        spectrum: String, 
        @BeanProperty 
        splash: Splash, 
        @BeanProperty 
        submitter: Submitter, 
        @BeanProperty 
        @([email protected])(`type` = FieldType.Nested) 
        tags: Array[Tags], 
        @([email protected])(`type` = FieldType.Nested) 
        authors: Array[Author] 
        ) 

} 

Он отлично работает и сохраняется этот объект.

Очевидно, что это настолько уродливо, что вы задумываетесь о том, есть ли там лучшие альтернативы, или было бы целесообразно написать обертку для проверки scala.

Альтернативно, вы можете переписать утилиту привязанного объекта и объект impl с одним из ваших собственных. Это можно сделать так, как в вашем классе конфигурации.

@Autowired 
    val objectMapper:ObjectMapper = null 

    @Bean 
    def elasticsearchTemplate: ElasticsearchOperations = { 
    new ElasticsearchTemplate(client,new EntityMapperImpl(objectMapper)) 
    } 

    @Bean 
    def client: Client = { 
    val client = new TransportClient() 
    val address = new InetSocketTransportAddress(hostname, port) 
    client.addTransportAddress(address) 

    client 
    } 

    class EntityMapperImpl(val mapper: ObjectMapper) extends EntityMapper { 

    override def mapToString(`object`: scala.Any): String =  mapper.writeValueAsString(`object`) 

    override def mapToObject[T](source: String, clazz: Class[T]): T =  mapper.readValue(source, clazz) 
    } 

И точная конфигурация для объекта картографа будет выглядеть

val mapper = new ObjectMapper() with ScalaObjectMapper 

mapper.registerModule(DefaultScalaModule) 

//required, in case we are provided with a list of value 
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
mapper.setSerializationInclusion(Include.NON_NULL); 
mapper 

который просто должен быть зарегистрирован как боб где

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