2016-05-05 15 views
11

Tôi không thể truy xuất dữ liệu mùa xuân làm việc cho các phiên bản Elasticsearch 2.0+.Không thể sử dụng tự động định cấu hình tùy chỉnh với spring-data-elasticsearch

Về việc sử dụng sau POM

<?xml version="1.0" encoding="UTF-8"?> 
<project 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.project.treasure</groupId> 
    <artifactId>search</artifactId> 
    <version>1.0.0</version> 
    <packaging>war</packaging> 
    <inceptionYear>2015</inceptionYear> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <start-class>com.project.treasure.search.application.Application</start-class> 
     <java.version>1.8</java.version> 
     <elasticsearch.version>2.2.0</elasticsearch.version> 
     <springdata.commons>1.12.0.BUILD-SNAPSHOT</springdata.commons> 
    </properties> 
    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.2.RELEASE</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 
    <dependencies> 
     <dependency> 
      <groupId>com.project.treasure.search</groupId> 
      <artifactId>search-client</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-elasticsearch</artifactId> 
      <version>2.0.0.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
      <scope>compile</scope> 
     </dependency>  
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
      <scope>compile</scope> 
     </dependency>  
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-logging</artifactId> 
      <scope>compile</scope> 
     </dependency>  
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-core</artifactId> 
      <version>1.1.2</version> 
     </dependency> 
     <!-- Json format --> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.3</version> 
     </dependency> 
     <!-- Kafka dependencies --> 
     <dependency> 
      <groupId>org.apache.kafka</groupId> 
      <artifactId>kafka_2.10</artifactId> 
      <version>0.8.1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.kafka</groupId> 
      <artifactId>kafka-clients</artifactId> 
      <version>0.9.0.0</version> 
     </dependency> 
    </dependencies> 
     <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
     <resources> 
      <resource> 
       <directory>src/main/resources</directory> 
       <excludes> 
        <exclude>conf/*.properties</exclude> 
       </excludes> 
      </resource> 
     </resources> 
     <finalName>ROOT</finalName> 
    </build> 
</project> 

Và thêm tùy chỉnh ElasticsearchConfiguration

package com.package.project.module.application; 

import org.elasticsearch.client.Client; 
import org.elasticsearch.client.transport.TransportClient; 
import org.elasticsearch.common.settings.Settings; 
import org.elasticsearch.common.transport.InetSocketTransportAddress; 
import org.elasticsearch.common.transport.TransportAddress; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.context.annotation.PropertySources; 
import org.springframework.core.env.Environment; 
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; 
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; 
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; 

import java.net.InetSocketAddress; 

import javax.annotation.Resource; 

@Configuration 
@PropertySources({ 
     @PropertySource(value = "classpath:elasticsearch.properties", ignoreResourceNotFound = true), 
     @PropertySource(value = "classpath:app.properties", ignoreResourceNotFound = true) }) 
@EnableElasticsearchRepositories(basePackages = "com.package.project.module.repository") 
public class ElasticsearchConfiguration { 
    @Resource 
    private Environment environment; 

    @Bean 
    public Client client() { 
     Settings settings = Settings.settingsBuilder().put("cluster.name", environment.getProperty("cluster.name")).build(); 
     Client client = TransportClient.builder().settings(settings).build(); 
     String[] addresses = environment.getProperty("cluster.nodes").split(","); 
     for (int i = 0; i < addresses.length; i++) { 
      System.out.println(addresses[i].trim()); 
      TransportAddress address = new InetSocketTransportAddress(new InetSocketAddress(addresses[i].trim(), Integer.parseInt(environment.getProperty("elasticsearch.port")))); 
      ((TransportClient) client).addTransportAddress(address); 
     } 
     return client; 
    } 

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

Với sau đây theo Application.java

@Configuration 
@ComponentScan(basePackages = "com.package.project.module") 
@EnableAutoConfiguration(exclude = {ElasticsearchConfiguration.class}) 
public class Application extends SpringBootServletInitializer { 

Tôi vẫn nhận được elasticsearch 1.5.2 (cùng với phiên bản 2.0.1.RELEASE bổ sung) làm phụ thuộc trong POM hiệu quả của tôi.

Chấp nhận lỗi sau trên ứng dụng đang chạy.

java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration.elasticsearchClient 
at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:64) 
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:102) 
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:178) 
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:140) 
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:116) 
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:333) 
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243) 
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273) 
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98) 
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520) 
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) 
at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) 
at com.snapdeal.treasure.search.application.Application.main(Application.java:20) 
Caused by: java.lang.IllegalArgumentException: @ConditionalOnMissingBean annotations must specify at least one bean (type, name or annotation) 
at org.springframework.util.Assert.isTrue(Assert.java:68) 
at org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanSearchSpec.validate(OnBeanCondition.java:279) 
at org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanSearchSpec.<init>(OnBeanCondition.java:275) 
at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:111) 
at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) 
... 17 common frames omitted 

Tôi đang làm theo các hướng dẫn như được đề cập trong tài liệu và tài liệu về gudub mùa xuân-dữ liệu elasticsearch.

+0

org.elasticsearch elasticsearch 2.0.0 cần thiết? – alpert

+0

Bạn có thể đăng toàn bộ POM của mình không? – Tunaki

+0

@Tunaki: Cập nhật hoàn tất POM –

Trả lời

9

Vấn đề là spring-boot 1.3.2.RELEASE chưa hoạt động với spring-data-elasticsearch 2.0.0-RELEASE.

spring-boot 1.3.2 sẽ bao gồm spring-boot-starter-data-elasticsearch 1.3.2-CHÍ mà vẫn depends on elasticsearch 1.5.2

ES 2.0 sẽ được hỗ trợ như của spring-boot 1.4.0-CHÍ mà vẫn chưa được phát hành (nhưng bạn có thể thử với 1.4. 0.BUILD-SNAPSHOT để xem nếu điều đó giúp)

vì bạn cũng rõ ràng bao gồm spring-data-elasticsearch 2.0.0-CHÍ bạn sẽ có được phiên bản 2.0 của elasticsearch bao gồm nhưng bạn nên loại bỏ sự phụ thuộc mà vì nó được quản lý bởi spring-boot-starters tự

+0

@UtkarshMishra Bạn có cần thêm thông tin nào không? – Val

+0

Xin lỗi vì không sớm chọn câu trả lời này. Tôi đã thử các giải pháp trên nhưng đã bị mắc kẹt với một [vấn đề] khác (http://www.slf4j.org/codes.html#multiple_bindings). Sẽ đảm bảo rằng các điểm của bạn được phục vụ tốt trong thời gian tới trong tương lai :) –

+0

Không phải lo lắng, vui vì nó đã làm việc cho bạn. – Val

2

Hãy làm theo các bước dưới đây

  • Remove phụ thuộc sau đây từ POM của bạn

 <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-elasticsearch</artifactId> 
     <version>2.0.0.RELEASE</version> 

  • Add phụ thuộc phụ thuộc sau mùa xuân-boot

<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-data-elasticsearch</artifactId> 
<version>1.3.5.RELEASE</version> 

3

Bạn sẽ cần phải chờ 1.4.x khởi động mùa xuân để sử dụng elasticsearch v2.2.2

mùa xuân-khởi động chi nhánh 1.3.x vẫn sử dụng v1.5.2 elasticsearch.


thử thay đổi pom và thay đổi của bạn:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.0.BUILD-SNAPSHOT</version> 
    <relativePath/> <!-- lookup parent from repository --> 
</parent> 

và thêm:

<repositories> 
    <repository> 
     <id>spring-snapshots</id> 
     <url>http://repo.spring.io/snapshot</url> 
     <snapshots><enabled>true</enabled></snapshots> 
    </repository> 
    <repository> 
     <id>spring-milestones</id> 
     <url>http://repo.spring.io/milestone</url> 
    </repository> 
</repositories> 
<pluginRepositories> 
    <pluginRepository> 
     <id>spring-snapshots</id> 
     <url>http://repo.spring.io/snapshot</url> 
    </pluginRepository> 
    <pluginRepository> 
     <id>spring-milestones</id> 
     <url>http://repo.spring.io/milestone</url> 
    </pluginRepository> 
</pluginRepositories> 
+0

Mùa xuân nào- phụ thuộc phiên bản dữ liệu-elasticsearch để thêm? –

+0

Bạn có thể cho tôi biết, bạn thích sử dụng phiên bản khởi động mùa xuân và ES nào? – akonczak

+0

Tôi linh hoạt với phiên bản khởi động mùa xuân (mặc dù 1.2.3.RELEASE được ưu tiên). Tôi muốn sử dụng [tính năng truy cập bên trong] (http://stackoverflow.com/questions/32830299/elasticsearch-inner-hits-in-java-api) được phát hành kể từ ES 1.5.2. –

Các vấn đề liên quan