[英]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
您必須將 EL 表達式添加到注釋中
@SolrDocument(collection = "#{@serverSolrContext.getCollectionName()}") public class SOLREntity implements Serializable {..... }
您必須使用方法getCollectionName()提供serverSolrContext Bean。
@Value("${solr.core}") private String core; public String getCollectionName() { return core; }
您必須在我們的 application.properties 中寫入以下核心條目。
solr.core=myOwnCoreName
實際上就是這樣,但是
如果你像我一樣得到以下異常:
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 種方法正在做這個把戲,我花了一段時間才找到正確的解決方案:
它就在這里,所以實際上我很幸運能找到這個:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.