java - Spring引导自动配置覆盖自定义(elasticsearchTemplate)配置

标签 java spring-boot spring-data-elasticsearch

我创建了以下配置(我复制了@Lazy,因为我无法使其工作)

@Lazy(true)
@Configuration
public class ElasticConfiguration
{
   private Logger logger = LoggerFactory.getLogger(ElasticConfiguration.class);

   @Value("${elasticsearch.host}")
   private String esHost;

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

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

   @Lazy(true)
   @Bean
   public Client client() throws Exception
   {
      Builder builder = Settings.builder();
      // builder.put("client.transport.sniff", true);
      Settings settings = builder.put("cluster.name", esClusterName).build();
      TransportClient client = new PreBuiltTransportClient(settings);
      InetAddress adress = InetAddress.getByName(esHost);
      client.addTransportAddress(new InetSocketTransportAddress(adress, esPort));
      logger.debug(
         "ES Client built with cluster.name;" + esClusterName + ";host;" + esHost + ";port;" + esPort + ";client.transport.sniff;"
            + builder.get("client.transport.sniff"));
      return client;
   }

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

我无法进行延迟初始化,因为我的配置似乎被 spring-boot 自动配置覆盖了

Overriding bean definition for bean 'elasticsearchTemplate' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=true; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=elasticConfiguration; factoryMethodName=elasticsearchTemplate; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [xxx/xxx/ElasticConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; factoryMethodName=elasticsearchTemplate; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfiguration.class]]

我还尝试在类上添加以下注释

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)

与以下属性相关,但效果不佳

org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx.xxx.ElasticConfiguration

我应该做什么?

最佳答案

好吧,我发现的唯一解决方案是使用以下属性

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration

请注意,使用以下注释对我不起作用......

@EnableAutoConfiguration(exclude={ElasticsearchDataAutoConfiguration.class})

编辑

事实上,我的问题是我的方法 elasticsearchTemplate() 返回 ElasticsearchOperations 而不是 ElasticsearchTemplate

更改签名时,@Lazy 注释似乎有效。

关于java - Spring引导自动配置覆盖自定义(elasticsearchTemplate)配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49115146/

相关文章:

java - CXF 客户端 SOAP 消息格式化

java - EC2 java sdk -> 使用公共(public)IP启动实例

java - 使用 JDBC JobStore 的 Quartz 调度器

java - 基于 Spring Boot 的测试中的上下文层次结构

mysql - UUID 在此位置无效(Mysql 工作台)

java - 如何抛出错误并同时返回空列表?

spring - Spring Mock MVC 测试的时区

java - 如何解决[类型删除],不建议在搜索请求中指定类型。“](elasticsearch 7.4.0,spring boot 2.2.6)?

elasticsearch - Elasticsearch-RestHighLevelClient与弹性云的连接

spring-mvc - Spring Data ElasticSearch - 找不到 GeoPoint 字段