Ошибка поиска упругой загрузки Spring при запуске сервера

#java #spring-boot #elasticsearch

#java #spring-boot #elasticsearch

Вопрос:

у нас есть одно приложение spring boot, в котором мы используем spring data elastic search. Мы используем классы сущностей для создания эластичных индексов. Один из таких классов показан ниже —

 
import javax.persistence.Id;

import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;


/**
 * The Class ElasticSearchSampleEntity.
 */
@Document(indexName = "Sample-index", type = "Sample-content")
public class ElasticSearchSampleEntity {

    /** The es Sample entity id. */
    @Id
    @Field(type = FieldType.Long, index = true, name = "id")
    private Long esSampleEntityId;


    /** The es no of questions. */
    @Field(type = FieldType.Integer, index = true)
    private Integer esNoOfQuestions;

    /** The es total marks. */
    @Field(type = FieldType.Integer, index = true)
    private Integer esTotalMarks;

    /** The es total time min. */
    @Field(type = FieldType.Short, index = true)
    private Short esTotalTimeMin;

    /** The es total time sec. */
    @Field(type = FieldType.Short, index = true)
    private Short esTotalTimeSec;

    /** The es occurances. */
    @Field(type = FieldType.Integer, index = true)
    private Integer esOccurances;


    /** The es rating. */
    @Field(type = FieldType.Float, index = true)
    private Float esRating;


    /** The es created on. */
    @Field(type = FieldType.Long, index = true)
    private Long esCreatedDate;

    /** The es updated on. */
    @Field(type = FieldType.Long, index = true)
    private Long esUpdatedDate;

    /** The es published date. */
    @Field(type = FieldType.Long, index = true)
    private Long publishedDate;

    /** The sample type id. */
    @Field(type = FieldType.Integer, index = true)
    private Integer sampleTypeId;


    //getter and setter

}
  

Это должно создать индекс один раз и сохранить данные на эластичном сервере. Однако во время развертываний мы время от времени получаем следующие ошибки (периодические проблемы).

 [main] ERROR o.s.boot.SpringApplication.reportFailure - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sampleController': Unsatisfied dependency expressed through field 'esSampleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'elasticSearchSampleServiceImpl': Unsatisfied dependency expressed through field 'esSampleRepo'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticSearchSampleRepository': Invocation of init method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: mapper [sampleTypeId] cannot be changed from type [long] to [integer]
  

SampleTypeId создается (или обновляется) до тех пор, пока иногда, хотя мы специально указали его как целое число. Это то, что вызывает проблему. Я также проверил тип данных при сохранении в elastic db, который выглядит нормально. Означает ли это, что эластичный индекс обновляется при каждом развертывании. Для баз данных, которые мы делаем spring.jpa.hibernate.ddl-auto=validate аналогично для elastic, можем ли мы сделать то же самое? Я не могу понять, почему возникает эта проблема. Сопоставление, похоже, в порядке. Пожалуйста, помогите мне здесь.

Ответ №1:

Приведенный ниже фрагмент из ваших журналов ошибок важен.

Конструктор выдал исключение; вложенным исключением является java.lang.Исключение IllegalArgumentException: сопоставитель [sampleTypeId] не может быть изменен с типа [long] на [integer]

Похоже, ранее вы создали индекс, в котором ваш sampleTypeId был определен как long , и теперь вы меняете его int , что невозможно, поэтому из elasticsearch генерируется исключение.

Вы можете подтвердить то же самое с помощью своего API-интерфейса elasticsearch GET index mapping и проверить ваш тип sampleTypeId данных в индексе.

Комментарии:

1. Да, я проверил get API. Я понимаю, что это проблема. Но в моем классе сущностей, как показано в вопросе, он упоминается как целое число. Я не понимаю, где и когда (и как) он меняется на Long. Идентификатор SampleType определяется как целое число, поэтому иногда он меняется на long. То же самое работает в некоторых развертываниях для меня. Это меня смутило.

2. @TheNightsWatch это странно, случайно, есть какой-либо другой способ изменения отображения этого поля?? Я бы предложил использовать статическое сопоставление, чтобы избежать подобных проблем, и отключить обновление сопоставления, если сможете.

3. Спасибо за ваше время. Я пока не могу понять, где он меняется и как отключить обновление сопоставлений.

4. @TheNightsWatch вы проверяли журналы индексации ES, чтобы выяснить это, в любом случае я могу рассказать вам, в чем проблема и как ее исправить, но вам нужно выяснить это из журналов 🙂

5. @TheNightsWatch, надеюсь, вы в безопасности, было бы здорово, если бы вы могли предоставить обновление здесь 🙂