Spring-boot: Duplicate core names in Solr Url in Spring Boot 1.5.1

Created on 18 Feb 2017  路  11Comments  路  Source: spring-projects/spring-boot

This issue was posted to StackOverflow in this post:

duplicate cores in url sent to solr from spring boot solr data

It describes the Solr Url duplicate core name issue pretty well.

I have encountered the same issue moving to Spring Boot 1.5.1 from 1.4.4 without resolution. The only things I can add to this issue are

1) This problem occurs with @EnableSolrRepositories multicoreSupport property true or false
2) @SolrDocument present or not on a Model class makes no difference
3) Seems when the original SolrServer Url contains the core name ex: http://localhost:8983/solr/corename that core name will be duplicated in the SolrJ URL
4) I went back several versions of org.apache.solr:solr-core and the problem persists. Like the SO poster I also went to Solr Core 6.3.0 without success. The only fix was going back to Spring Boot 1.4.x.

I plan on staying with v1.5.1 so my only remedy was going with a Solr Embedded configuration until a solution is found.

Thanks!

Most helpful comment

Hi, i encountered with this bug today.
I solved it with workaround:

  • first we need to extend class HttpSolrClient with the same simple class name. the Same simple class name is necessary due to logic in org.springframework.data.solr.server.support.SolrClientUtils.clone(T, String).
  • than create bean of our new extended HttpSolrClient in spring application.

the our extended class of HttpSolrClient

package ru.avn;

import java.io.IOException;

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.solr.client.solrj.ResponseParser;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServerException;

public class HttpSolrClient extends  org.apache.solr.client.solrj.impl.HttpSolrClient {
    private static final long serialVersionUID = 1973496789131415484L;


    public HttpSolrClient(String baseURL,
                          HttpClient client,
                          ResponseParser parser) {
        super(baseURL, client, parser);
    }


    public HttpSolrClient(String baseURL, HttpClient client) {
        super(baseURL, client);
    }


    public HttpSolrClient(String baseURL) {
        super(baseURL);
    }


    @SuppressWarnings("rawtypes")
    @Override
    protected HttpRequestBase createMethod(SolrRequest request,
                                           String collection) throws IOException, SolrServerException {
        String col = (collection != null && baseUrl.endsWith(collection)) ? null : collection;  
        return super.createMethod(request, col);
    }
}

Spring application config

    static final String SOLR_HOST = "solr.host";

    @Resource private Environment environment;

    @Bean
    public SolrClient solrClient() {
        String solrHost = environment.getRequiredProperty(SOLR_HOST);
        return new ru.avn.HttpSolrClient(solrHost);
    }

All 11 comments

I don't recall any changes to Boot's Solr support in 1.5. Have you tried using a different version of Spring Data Solr? The best was to do that is to override the spring-data-releasetrain.version property. A sample that reproduces the problem would also be useful.

/cc @christophstrobl

Andy, thank you for the quick response and the suggestion to override the spring-data-releasetrain.version property. Setting the version to Hopper-SR7 indeed solved my problem, though the Spring Boot 1.5.1 Duplicate Core Name issue in Solr I think still exists.

You asked for a sample that reproduces the problem so I put one together from the Spring Boot Data Solr Sample. You will find that here.

In brief, when you run the tests in the Sample Project you'll see "collection1/collection1" in the url.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Error 404 Not Found</title>
</head>
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /solr/collection1/collection1/update. Reason:
<pre>    Not Found</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/>

</body>
</html>

Thanks!

Thanks, @minster

The duplicate collection in the URL is a result of this change in Spring Data Solr.

This looks like a bug in Spring Data Solr to me. @christophstrobl can you please take a look?

I've raise DATASOLR-364 for @christophstrobl or someone else from the team to look at. I'll close this since it's not really a Spring Boot issue.

Sorry for long silence - thanks @mintster for setting up the test project. I've just pushed some changes for DATASOLR-364. Snapshot builds (spring-data-solr:2.2.0.DATASOLR-364-SNAPSHOT) should be available shortly via _repo.spring.io_ in case you want to give them a try.

@christophstrobl Any plans to backport to 2.1.x? We can't pick up 2.2.0 in Boot 1.5.x

@philwebb yes - will be back ported to 2.1.x. but won't be in the Ingalls SR1.

I also faced with this issue and spend a lot of time to investigate it. :disappointed: As a temporarily solution the @christophstrobl 's advice works fine for me (build.gradle):

compile('org.springframework.data:spring-data-solr:2.2.0.DATASOLR-364-SNAPSHOT')

Thank you!

hey .. any plans for 2.1.2? this issue blocked me!

@valeriucraciun DATASOLR-364 has been resolved but there is no release available for us to pick up yet.

Hi, i encountered with this bug today.
I solved it with workaround:

  • first we need to extend class HttpSolrClient with the same simple class name. the Same simple class name is necessary due to logic in org.springframework.data.solr.server.support.SolrClientUtils.clone(T, String).
  • than create bean of our new extended HttpSolrClient in spring application.

the our extended class of HttpSolrClient

package ru.avn;

import java.io.IOException;

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.solr.client.solrj.ResponseParser;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServerException;

public class HttpSolrClient extends  org.apache.solr.client.solrj.impl.HttpSolrClient {
    private static final long serialVersionUID = 1973496789131415484L;


    public HttpSolrClient(String baseURL,
                          HttpClient client,
                          ResponseParser parser) {
        super(baseURL, client, parser);
    }


    public HttpSolrClient(String baseURL, HttpClient client) {
        super(baseURL, client);
    }


    public HttpSolrClient(String baseURL) {
        super(baseURL);
    }


    @SuppressWarnings("rawtypes")
    @Override
    protected HttpRequestBase createMethod(SolrRequest request,
                                           String collection) throws IOException, SolrServerException {
        String col = (collection != null && baseUrl.endsWith(collection)) ? null : collection;  
        return super.createMethod(request, col);
    }
}

Spring application config

    static final String SOLR_HOST = "solr.host";

    @Resource private Environment environment;

    @Bean
    public SolrClient solrClient() {
        String solrHost = environment.getRequiredProperty(SOLR_HOST);
        return new ru.avn.HttpSolrClient(solrHost);
    }
Was this page helpful?
0 / 5 - 0 ratings