Search code examples
spring-bootspring-data-solr

Using new version of Spring data Solr with Spring boot


I'm using Spring Data Solr in a Spring boot application (1.2.7). Now, because of Spring Data Solr Precedence for Custom Repository I have to update Spring Data Solr to 1.4.x at least, while it's currently on 1.3.x.

However, if I explicitely add the following dependency:

<dependency>
   <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-solr</artifactId>
    <version>1.4.2.RELEASE</version>
</dependency>

And I run the application, I get the following exception:

Caused by: java.lang.NoClassDefFoundError: org/springframework/data/mapping/PersistentPropertyAccessor
    at org.springframework.data.solr.core.SolrTemplate.getDefaultSolrConverter(SolrTemplate.java:573)
    at org.springframework.data.solr.core.SolrTemplate.afterPropertiesSet(SolrTemplate.java:622)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
    ... 61 more
Caused by: java.lang.ClassNotFoundException: org.springframework.data.mapping.PersistentPropertyAccessor
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 65 more

I know that you should usually trust the dependency management of Spring boot itself, but that means you're not able to put parentheses around parts of a Solr query using criteria, which is pretty critical.


Solution

  • Spring Data's released as a group of modules that are all designed to work together. By only upgrading spring-data-solr you're trying to get it to work with older versions of all of its Spring Data dependencies. I'd recommend upgrading all of Spring Data instead so that you get a consistent set of versions.

    The Spring Data Fowler release train contains Spring Data Solr 1.4.x and SR2 contains Spring Data Solr 1.4.2. Assuming you're using spring-boot-starter-parent as your pom's parent, you can use this version by overriding the spring-data-releasetrain.version property:

    <properties>
        <spring-data-releasetrain.version>Fowler-SR2</<spring-data-releasetrain.version>
    </properties>