我的 Spring Boot 应用程序使用 Spring Data for Apache Solr 4.3.15,使用 Spring Boot 3.2 (3.2.9) 可以正常运行,但使用 Spring Boot 3.3 (3.3.3) 会产生 ClastCastException:
java.lang.ClassCastException: class org.springframework.data.repository.query.DefaultParameters cannot be cast to class org.springframework.data.solr.repository.query.SolrParameters (org.springframework.data.repository.query.DefaultParameters and org.springframework.data.solr.repository.query.SolrParameters are in unnamed module of loader 'app')
at org.springframework.data.solr.repository.query.SolrQueryMethod.getParameters(SolrQueryMethod.java:619) ~[spring-data-solr-4.3.15.jar:4.3.15]
at org.springframework.data.solr.repository.query.SolrParametersParameterAccessor.<init>(SolrParametersParameterAccessor.java:37) ~[spring-data-solr-4.3.15.jar:4.3.15]
at org.springframework.data.solr.repository.query.AbstractSolrQuery.execute(AbstractSolrQuery.java:112) ~[spring-data-solr-4.3.15.jar:4.3.15]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) ~[spring-data-commons-3.3.3.jar:3.3.3]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) ~[spring-data-commons-3.3.3.jar:3.3.3]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:169) ~[spring-data-commons-3.3.3.jar:3.3.3]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:148) ~[spring-data-commons-3.3.3.jar:3.3.3]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.12.jar:6.1.12]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) ~[spring-tx-6.1.12.jar:6.1.12]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.1.12.jar:6.1.12]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.12.jar:6.1.12]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) ~[spring-tx-6.1.12.jar:6.1.12]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.12.jar:6.1.12]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.1.12.jar:6.1.12]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.12.jar:6.1.12]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) ~[spring-aop-6.1.12.jar:6.1.12]
at jdk.proxy3/jdk.proxy3.$Proxy116.findTop20ByNewestVersionTrue(Unknown Source) ~[na:na]
...
Spring Data 3.3.x 似乎引入了导致这种不兼容性的更改。知道 Spring Data for Apache Solr 不再维护,我该如何解决这个问题?
Spring Data 3.3.x 中引入了两个不兼容性,一个在类
QueryMethod
中(现在调用具有不同参数的 createParameters(...)
方法,该方法不会被子类 SolrQueryMethod
覆盖),另一个在类 中Parameters
(已删除构造函数,由子类SolrParameters
使用)。
您需要修补 Spring Data for Apache Solr 4.3.15 中的两个类
SolrParameters
和 SolrQueryMethod
,以使它们在 Spring Boot 3.3.x 下工作并保持它们在早期版本下工作:
diff -r -b src/main/java/org/springframework/data/solr/repository/query/SolrParameters.java src/main/java/org/springframework/data/solr/repository/query/SolrParameters.java
22a23
> import org.springframework.data.repository.query.ParametersSource;
30c31
< super(method);
---
> super(ParametersSource.of(method), SolrParameter::new);
37d37
< @Override
diff -r -b src/main/java/org/springframework/data/solr/repository/query/SolrQueryMethod.java src/main/java/org/springframework/data/solr/repository/query/SolrQueryMethod.java
33a34,35
> import org.springframework.data.repository.query.Parameters;
> import org.springframework.data.repository.query.ParametersSource;
612d613
< @Override
617a619,628
> protected Parameters<?, ?> createParameters(Method method, TypeInformation<?> domainType) {
> return createParameters(method);
> }
>
> @Override
> protected Parameters<?, ?> createParameters(ParametersSource parametersSource) {
> return createParameters(parametersSource.getMethod());
> }
>
> @Override