ElasticSearch SpringBoot + Spring Data: java.lang.IllegalStateException: в интерфейсе не найдено подходящего конструктора - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь расширить ElasticsearchRepository в моем проекте, но не могу из-за следующей ошибки

Причина: java.lang.IllegalStateException: Нет подходящего конструктора найдено на интерфейсе com.example.elasticSearchDemo.Repository.ESDemoRepository, чтобы соответствовать приведенные аргументы: [класс org.springframework.data.elasticsearch.repository.support.MappingElasticsearchEntityInformation, учебный класс org.springframework.data.elasticsearch.core.ElasticsearchTemplate]. Убедитесь, что вы реализуете конструктор, взяв эти

//My interface that extends ElasticSearchRepository:

public interface ESDemoRepository extends ElasticsearchRepository<Data, String>{
    Page<Data> findByEsblog_flow_name(String flow_name, Pageable pageable);

    List<Data> findByEsblog_type(String type);
}

//Data class
@Document(indexName = "logdata", type="doc")
public class Data {
 @Id
 private String id;
 private String esblog_time;
 private String esblog_appl_name;
 private String esblog_host_name;
 private String esblog_iib_name;
 private String esblog_flow_name;
 private String esblog_payload;
 private String esblog_type;
 private Integer esblog_retention;
 private String esblog_tansaction_id;

@Override
public String toString() {
    return "Data{" +
            "id='" + id + '\'' +
            ", time='" + esblog_time + '\'' +
            ", payload='" + esblog_payload + '\'' +
            ", type='" + esblog_type + '\'' +
            ", retention='" + esblog_retention + '\'' +
            '}';
}

}

@Configuration
@EnableElasticsearchRepositories(repositoryBaseClass = 
ESDemoRepository.class,basePackages="com.example.elasticSearchDemo")
public class ESConfiguration {
@Value("${elasticsearch.host}")
private String EsHost;

@Value("${elasticsearch.port}")
private int EsPort;

@Value("${elasticsearch.clustername}")
private String EsClusterName;


@Bean
public Client client() throws Exception {

    Settings settings = Settings.builder()
            .put("cluster.name", EsClusterName).build();
 return  new PreBuiltTransportClient(settings)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(EsHost), EsPort));
}

@Bean
public ElasticsearchOperations elasticsearchTemplate() throws Exception {
    return new ElasticsearchTemplate(client());
}

}

@Service
public class DemoServiceImpl implements DemoService {



private ESDemoRepository demoRepository;
@Autowired
public void setDemoRepository(ESDemoRepository demoRepository){this.demoRepository=demoRepository;}

private ESDemoDAO esDemoDAO;
@Autowired
public void setEsDemoDAO(ESDemoDAO demoDAO){this.esDemoDAO=demoDAO;}

public String save(Data data) throws Exception {
    return esDemoDAO.esQueryDemo(data);
}

public void delete(Data data) {
    demoRepository.delete(data);
}

public Data findOne(String id) throws Exception {
    return esDemoDAO.esGetQuery(id);
}

public Iterable<Data> findAll() {
    return demoRepository.findAll();
}


public List<Data> findByType(String type) {
    return demoRepository.findByEsblog_type(type);
}

1 Ответ

0 голосов
/ 28 июня 2018

В вашем классе конфигурации:

@Configuration
@EnableElasticsearchRepositories(repositoryBaseClass = 
ESDemoRepository.class,basePackages="com.example.elasticSearchDemo")
public class ESConfiguration {
@Value("${elasticsearch.host}")
private String EsHost;

@Value("${elasticsearch.port}")
private int EsPort;

@Value("${elasticsearch.clustername}")
private String EsClusterName;


@Bean
public Client client() throws Exception {

    Settings settings = Settings.builder()
            .put("cluster.name", EsClusterName).build();
 return  new PreBuiltTransportClient(settings)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(EsHost), EsPort));
}

@Bean
public ElasticsearchOperations elasticsearchTemplate() throws Exception {
    return new ElasticsearchTemplate(client());
}

Заменить:

 @EnableElasticsearchRepositories(repositoryBaseClass = 
    ESDemoRepository.class,basePackages="com.example.elasticSearchDemo")

С этим:

 @EnableElasticsearchRepositories(basePackages="com.example.elasticSearchDemo")

EDIT

После этого изменения возникает исключение:

error:Caused by: org.springframework.data.mapping.PropertyReferenceException: No property esblog found for type Data!

Это из-за соглашения о плохом имени, потому что подчеркивание _ является зарезервированным символом в Spring Data. Согласно:

https://stackoverflow.com/a/23475349/6003541

Есть два решения:

  1. Используйте символ верблюда вместо подчеркивания.
  2. Использовать двойное подчеркивание в классе репозитория
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...