5

Có thể chỉ định động (khi chạy) indexName cho mỗi @Document, ví dụ, thông qua tệp cấu hình không? Hoặc là có thể làm cho @Document Môi trường mùa xuân (dev, prod) phụ thuộc?Dữ liệu Spring Elasticsearch @Document indexName được xác định tại thời gian chạy

Cảm ơn bạn!

+0

Cũng cần một số giải pháp dựa trên môi trường/hồ sơ. Tên chỉ mục được chèn vào chú thích không phải là lựa chọn tốt nhất ... –

+0

Tôi đã cố gắng làm điều tương tự bằng cách sử dụng một cái gì đó tương tự như khi bạn sử dụng @Value, nhưng không có may mắn được nêu ra. Xem [câu hỏi này] (http://stackoverflow.com/questions/31829456/inject-spel-parameter-on-annotation-parameter-like-what-is-done-with-value-on) để biết thêm thông tin. – Victor

+0

Bạn không thể sử dụng @Value theo cách này bởi vì nó không phải là bean được quản lý/tạo bởi Spring nhưng bạn sử dụng MyBean mới(). Tôi vẫn không thể có ý tưởng đằng sau cài đặt chú thích này. Tất cả mọi người phải đối phó với điều này ví dụ khi sử dụng indexName diffent cho dev và prod. Làm thế nào để bạn làm điều này? –

Trả lời

7

Chú thích @Document không cho phép chuyển trực tiếp tên chỉ mục trong tham số. Tuy nhiên tôi tìm thấy một công việc xung quanh.

Trong lớp cấu hình của tôi, tôi đã tạo Bean trả về một chuỗi. Trong chuỗi này, tôi tiêm tên của chỉ số với @value:

@Value("${etrali.indexname}") 
private String indexName; 

@Bean 
public String indexName(){ 
    return indexName; 
} 

Sau đó người ta có thể tiêm các chỉ số vào chú thích @Documentation như thế này:

@Document(indexName="#{@indexName}",type = "syslog_watcher") 

Nó làm việc cho tôi, tôi hy vọng nó sẽ giúp bạn.

Trân trọng

1

Giải pháp từ Bruno có thể hoạt động nhưng phần "Tôi tạo ra một Bean trả về một chuỗi" hơi khó hiểu.

Sau đây là cách tôi làm điều đó:

  • Có "index.name" chìa khóa có giá trị trong một tập tin application.properties nạp bởi "<context:property-placeholder location="classpath:application.properties" />"

  • Tạo một bean tên ConfigBean chú thích với @Named hoặc @Component


    @Named 
    public class ConfigBean { 

     @Value("${index.name}") 
     private String indexName; 

     public String getIndexName() { 
     return indexName; 
     } 

     public void setIndexName(String indexName) { 
     this.indexName = indexName; 
     }  

    } 
  • Tiêm giá trị của configBean.getIndexName() vào "@Document" chú thích sử dụng Spring EL: @Document(indexName = "#{ configBean.indexName }", type = "myType")

T.B. : Bạn có thể đạt được kết quả tương tự trực tiếp bằng cách sử dụng bean ngầm "systemProperties" (một cái gì đó như # {systemProperties ['index.name']}) nhưng nó không hoạt động đối với tôi và rất khó gỡ lỗi vì bạn không thể giải quyết systemProperties trong ngữ cảnh có lập trình (https://jira.spring.io/browse/SPR-6651)

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