簡體   English   中英

根據 PropertyValue 設置 Spring SolrDocument 集合名稱

[英]Set Spring SolrDocument Collection name based on PropertyValue

我想根據 application.yml 值設置值 Spring SolrDocument Collection。

@Data
@SolrDocument(collection = @Value("${solr.core}"))
public class SearchableProduct {
}

海米歇拉,

好的,我有同樣的問題,我找到了解決方案:SpEL

此處有詳細描述: Apache Solr 的 Spring Data

  1. 您必須將 EL 表達式添加到注釋中

    @SolrDocument(collection = "#{@serverSolrContext.getCollectionName()}") public class SOLREntity implements Serializable {..... }
  2. 您必須使用方法getCollectionName()提供serverSolrContext Bean。

     @Value("${solr.core}") private String core; public String getCollectionName() { return core; }
  3. 您必須在我們的 application.properties 中寫入以下核心條目。

     solr.core=myOwnCoreName

    實際上就是這樣,但是

  4. 如果你像我一樣得到以下異常:

org.springframework.expression.spel.SpelEvaluationException: EL1057E: 沒有在上下文中注冊的 bean 解析器來解析對 bean 的訪問

您的配置 Bean 中必須包含以下內容

    @Configuration
    @EnableSolrRepositories(basePackages = { "de.solr.db" })
    @Profile("default")
    @PropertySource("classpath:application.properties")
    public class ServerSolrContext extends AbstractSolrConfiguration {

        private static final Logger logger = LoggerFactory.getLogger(ServerSolrContext.class);

        @Resource
        private Environment environment;

        @Value("${solr.core}")
        private String core;

        public String getCollectionName() {
            return core;
        }

        @PostConstruct
        public void init() {
            System.out.println(core);
        }

        @Bean
        public SolrClient solrClient() {
            String url = environment.getProperty("solr.server.url");
            String user = environment.getProperty("solr.server.user");
            String password = environment.getProperty("solr.server.password");

            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
                            new UsernamePasswordCredentials(user, password));
            SSLContext sslContext = null;
            try {
                sslContext = ReportConfiguration.getTrustAllContext();
            }
            catch (KeyManagementException | NoSuchAlgorithmException e) {
                e.printStackTrace();
            }

            LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext);
            HttpClient httpClient = HttpClientBuilder.create().setSSLSocketFactory(sslSocketFactory)
                            .addInterceptorFirst(new PreemptiveAuthInterceptor()).setDefaultCredentialsProvider(credentialsProvider)
                            .build();

            SolrClient client = new HttpSolrClient.Builder().withHttpClient(httpClient).withBaseSolrUrl(url).build();
            return client;
        }

        @Bean
        @ConditionalOnMissingBean(name = "solrTemplate")
        public SolrTemplate solrTemplate(@Qualifier("mySolrTemplate") SolrTemplate solrTemplate) {
            return solrTemplate;
        }


        @Bean("mySolrTemplate")
        public SolrTemplate mySolrTemplate(SolrClient solrClient, SolrConverter solrConverter) {
            return new SolrTemplate(new HttpSolrClientFactory(solrClient), solrConverter); 

        }

        @Override
        public SolrClientFactory solrClientFactory() {
            return new HttpSolrClientFactory(solrClient());
        }

    }

最后 3 種方法正在做這個把戲,我花了一段時間才找到正確的解決方案:

它就在這里,所以實際上我很幸運能找到這個:

在@SolrDocument solrCoreName 中允許 PropertyPlaceholders

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM