在 Spring Boot 3.3.x 中使用 Spring Data for Apache Solr 时出现 ClassCastException

问题描述 投票:0回答:1

我的 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-boot spring-data spring-data-solr
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.