2016-10-29 1 views
0

У меня есть Solr 6.2.1 как SolrCloud. Позже я настроил базовую аутентификацию. Я собираюсь настроить Spring SOLR данные 2.0.4.RELEASE с Solrj 6.2, и это мой код:Как настроить данные о пружине Соединение SolrCloud с базовой аутентификацией

@Configuration 
@EnableSolrRepositories(basePackages = { "ir.saeed.server.solr" }, multicoreSupport = true) 

public class SearchContext { 

    @Value("${solr.host}") 

    private String host; 


    @Value("${solr.port}") 

    private Integer port; 


    @Value("${solr.username}") 

    private String username; 


    @Value("${solr.password}") 

    private String password; 


    @Value("${zkHost}") 

    private String zkHost; 


    @Value("${solr.coreName}") 

    private String collectionName; 


    @Bean 

    public SolrTemplate solrTemplate() { 

     return new SolrTemplate(solrClientFactory()); 

    } 


    @Bean 

    public BasicCredentialsProvider credentialsProvider() { 

     BasicCredentialsProvider provider = new BasicCredentialsProvider(); 

     provider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); 

     return provider; 

    } 


    @Bean 

    public SolrClientFactory solrClientFactory() { 

     return new HttpSolrClientFactory(solrClient(), "", credentialsProvider().getCredentials(AuthScope.ANY), "BASIC"); 

    } 


    @Bean 

    public SolrClient solrClient() { 

     return new CloudSolrClient.Builder().withZkHost(zkHost).build(); 

    } 

} 

Но когда я бегу мое веб-приложение, это исключение встречается,:

10:51:48,110 org.springframework.data.solr.UncategorizedSolrException: nested exception is java.lang.NullPointerException 


10:51:48,111 at org.springframework.data.solr.core.SolrTemplate.execute(SolrTemplate.java:172) 


10:51:48,111 at org.springframework.data.solr.core.SolrTemplate.executeSolrQuery(SolrTemplate.java:509) 


10:51:48,111 at org.springframework.data.solr.core.SolrTemplate.query(SolrTemplate.java:504) 


10:51:48,111 at org.springframework.data.solr.core.SolrTemplate.doQueryForPage(SolrTemplate.java:338) 


10:51:48,111 at org.springframework.data.solr.core.SolrTemplate.queryForPage(SolrTemplate.java:350) 

Как может Я разрешаю проблему? Я думаю, что моя Конфигурация неверна

+0

Я изменил мою конфигурацию Теперь я использую solrj-5.5 и 3.4.6 Zookeeper и я изменил эту строку: вернуть новый CloudSolrClient.Builder() withZkHost (zkHost)..построить(); : вернуть новый CloudSolrClient (zkURL); но мой вопрос не решить теперь это исключение встречается,: 11: 08: 43,827 org.springframework.data.solr.UncategorizedSolrException: Ошибка с сервера 11: 08: 43827 11: 08: 43,827 11: 08: 43827 Ошибка 401 требуется проверка подлинности 11: 08: 43827 –

ответ

0

Существует несколько причин, по которым ваш код не работает, но они в основном связаны с отсутствующими функциями spring-data-solr.

Прежде всего spring-data-solr версия 2.0.4 не поддерживает функции Solr 5 (облако). Так это и есть причина, почему вы получаете NullPointerException в методе org.springframework.data.solr.server.support.SolrClientUtils#cloneLBHttpSolrClient

Я попытался увидеть ли он работает сценарий разоблачен вас с последним фотоснимком (2.1.0-SNAPSHOT) весенне-данных- Solr и после нескольких модификаций на классе конфигурации SolrContext пружинных:

@Configuration 
@EnableSolrRepositories(basePackages = {"com.acme.solr"}) 
// notice that the multicoresupport is left false 
// see org.springframework.data.solr.repository.config.SolrRepositoryConfigExtension#postProcess(org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource) for details 
public class SolrContext { 

    @Bean 
    public Credentials credentials(@Value("${solr.username}") String username, @Value("${solr.password}") String 
      password) { 
     return new UsernamePasswordCredentials(username, password); 
    } 

    @Bean 
    public BasicCredentialsProvider credentialsProvider(Credentials credentials) { 
     BasicCredentialsProvider provider = new BasicCredentialsProvider(); 
     provider.setCredentials(AuthScope.ANY, credentials); 

     return provider; 
    } 

    @Bean 
    public SolrClientFactory solrClientFactory(SolrClient solrClient, Credentials credentials) { 
     return new HttpSolrClientFactory(solrClient, "", credentials, "BASIC"); 

    } 

    // create a solrtemplate bean, so that it is used in 
    // org.springframework.data.solr.repository.support.SolrRepositoryFactoryBean#doCreateRepositoryFactory method 
    // for using org.springframework.data.solr.repository.support.SolrRepositoryFactory#SolrRepositoryFactory(org.springframework.data.solr.core.SolrOperations) constructor 
    @Bean 
    public SolrTemplate solrTemplate(SolrClientFactory solrClientFactory){ 
     return new SolrTemplate(solrClientFactory); 
    } 

    @Bean 
    public CloudSolrClient solrClient(@Value("${zkHost}") String zkHost) { 
     CloudSolrClient solrClient = new CloudSolrClient.Builder().withZkHost(zkHost).build(); 
     solrClient.setDefaultCollection("gettingstarted"); 
     return solrClient; 
    } 
} 

я все-таки получил облигационные 401 аутентификации при выполнении запроса Solr (когда базовая аутентификация была включена Solr).

В приложении solrj ванили, это как бы сделать заверенную запрос:

CloudSolrClient solr = new CloudSolrClient.Builder() 
      .withZkHost("localhost:9983") 
      .build(); 

    SolrQuery query = new SolrQuery(); 
    query.setQuery("*:*"); 
    SolrRequest<QueryResponse> req = new QueryRequest(query); 
    req.setBasicAuthCredentials("solr", "SolrRocks"); 
    QueryResponse rsp = req.process(solr, "gettingstarted"); 

    System.out.println("numFound: " + rsp.getResults().getNumFound()); 

При поиске ли метод SolrRequest#setBasicAuthCredentials(String, String) используется в коде пружинных данных, Solr я не заметил где-нибудь этот метод используется. Таким образом, очень вероятно, что эта функция еще не реализована даже на сборке SNAPSHOT файла spring-data-solr.

Я создал feature request проект spring-data-solr, чтобы добавить поддержку этой функции.

0

Я нашел обходное решение для тех, у кого такая же проблема Расширяет ваш собственный HttpSolrClientFactory. проблема, вызванная тем, что HTTP-клиент LBHttpSolrClient не настроен должным образом. правильная установка должна быть как следующий блок если (solrClient InstanceOf LBHttpSolrClient) {...}

AuthHttpSolrClientFactory.java

@SuppressWarnings ("устаревания") общественного класса AuthHttpSolrClientFactory простирается HttpSolrClientFactory {

public AuthHttpSolrClientFactory(SolrClient solrClient, String core, Credentials credentials, String authPolicy) { 
    super(solrClient, core, credentials, authPolicy); 
    Assert.notNull(solrClient, "solrClient must not be null"); 
    if (authPolicy != null) { 
     Assert.hasText(authPolicy); 
    } 
    appendBasicAuthentication(credentials, authPolicy, this.getSolrClient()); 
} 

private void appendBasicAuthentication(Credentials credentials, String authPolicy, SolrClient solrClient) { 
    if(credentials != null) { 
     if (solrClient instanceof HttpSolrClient) { 
      HttpSolrClient httpSolrClient = (HttpSolrClient) solrClient; 
      if (assertHttpClientInstance(httpSolrClient.getHttpClient())) { 
       AbstractHttpClient httpClient = (AbstractHttpClient) httpSolrClient.getHttpClient(); 
       httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY), credentials); 
       httpClient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF, Arrays.asList(authPolicy)); 
      } 
     } 
     else if (solrClient instanceof LBHttpSolrClient) { 
      LBHttpSolrClient lbhttpSolrClient = (LBHttpSolrClient) solrClient; 
      if (assertHttpClientInstance(lbhttpSolrClient.getHttpClient())) { 
       AbstractHttpClient httpClient = (AbstractHttpClient) lbhttpSolrClient.getHttpClient(); 
       httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY), credentials); 
       httpClient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF, Arrays.asList(authPolicy)); 
      } 
     } 
    } 
} 

private boolean assertHttpClientInstance(HttpClient httpClient) { 
    Assert.isInstanceOf(AbstractHttpClient.class, httpClient, 
      "HttpClient has to be derivate of AbstractHttpClient in order to allow authentication."); 
    return true; 
} 

}

фасоли s-solr.xml

<solr:solr-client id="solrClient" url="${solr.host}" /> 
<bean id="credentials" class="org.apache.http.auth.UsernamePasswordCredentials"> 
    <constructor-arg type="java.lang.String" value="${solr.credentials}"/> 
</bean> 
<bean id="solrClientFactory" class="com.example.solr.AuthHttpSolrClientFactory" scope="singleton"> 
    <constructor-arg ref="solrClient" /> 
    <constructor-arg name="core"> 
     <null /> 
    </constructor-arg> 
    <constructor-arg ref="credentials" /> 
    <constructor-arg type="java.lang.String" value="BASIC"/> 
</bean> 
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate" scope="singleton"> 
    <constructor-arg ref="solrClientFactory" /> 
    <constructor-arg name="requestMethod"> 
     <value type="org.springframework.data.solr.core.RequestMethod">POST</value> 
    </constructor-arg> 
</bean> 
+0

для пружинных-данных-данных 3.0, просто удалить *** core *** из приведенного выше примера он будет работать. – Fei

Смежные вопросы