java.lang.NoClassDefFoundError 在 spring 数据卡桑德拉项目中

java.lang.NoClassDefFoundError in spring data cassandra project

我是 spring 数据项目的新手,我正在开发示例应用程序。我在部署我的 spring data cassandra 项目时出现以下异常。

Caused by: java.lang.NoClassDefFoundError: org/springframework/core/ReactiveTypeDescriptor
    ... 58 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.core.ReactiveTypeDescriptor
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285) ~[catalina.jar:8.5.15]
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) ~[catalina.jar:8.5.15]
    ... 58 common frames omitted

我的仓库class如下,

public interface UserDao extends CassandraRepository<User, Long> {

  <S extends User> S save(S entity);

  Optional<User> findById(Long primaryKey);
}

Spring 配置,

   <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:cassandra="http://www.springframework.org/schema/data/cassandra"

   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

    http://www.springframework.org/schema/data/cassandra
    http://www.springframework.org/schema/data/cassandra/spring-cassandra.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

<context:component-scan base-package="advertise"/>
<mvc:annotation-driven/>
<context:property-placeholder location="classpath:system.properties,classpath:cassandra.properties"
                              ignore-resource-not-found="true"
                              ignore-unresolvable="true"/>

<!--Common beans-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>


<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="50000000"/>
</bean>

<mvc:resources mapping="/css/**" location="/css"/>
<mvc:resources mapping="/js/**" location="/js"/>
<mvc:resources mapping="/fonts/**" location="/fonts"/>
<mvc:resources mapping="/images/**" location="/images"/>
<mvc:resources mapping="/uploads/**" location="file:/${upload.dir}"/>

<!-- Default bean name is 'cassandraCluster' -->
<!--<cassandra:cluster contact-points="${cassandra.contactpoints}" port="${cassandra.port}">
    <cassandra:keyspace action="CREATE_DROP" name="${cassandra.keyspace}" />
</cassandra:cluster>

&lt;!&ndash; Default bean name is 'cassandraSession' &ndash;&gt;
<cassandra:session keyspace-name="${cassandra.keyspace}" schema-action="NONE" />-->

<!-- REQUIRED: The Cassandra Cluster -->
<cassandra:cluster id="cluster" contact-points="${cassandra.contactpoints}" port="${cassandra.port}" />

<!-- REQUIRED: The Cassandra Session, built from the Cluster, and attaching
to a keyspace -->
<cassandra:session id="session" keyspace-name="${cassandra.keyspace}" cluster-ref="cluster" />

<!-- REQUIRED: The Default Cassandra Mapping Context used by CassandraConverter -->
<cassandra:mapping>
    <cassandra:user-type-resolver keyspace-name="${cassandra.keyspace}" />
</cassandra:mapping>

<!-- REQUIRED: The Default Cassandra Converter used by CassandraTemplate -->
<cassandra:converter />

<!-- REQUIRED: The Cassandra Template is the building block of all Spring
Data Cassandra -->
<cassandra:template id="cassandraTemplate" session-ref="session" />

<!-- OPTIONAL: If you are using Spring Data for Apache Cassandra Repositories, add
your base packages to scan here -->
<cassandra:repositories base-package="advertise.orm.d ao" cassandra-template-ref="cassandraTemplate" />

相关依赖,

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-cassandra</artifactId>
        <version>2.0.3.RELEASE</version>
    </dependency>

我的spring版本是4.2.2.RELEASE和springdata cassandra版本是2.0.3.RELEASE.是这个错误是因为版本不匹配?还是因为我的其他错误? 如果您能帮我解决这个问题,我将不胜感激。谢谢。

这肯定是版本不匹配。 ReactiveTypeDescriptor class 自 Spring 5.0 发布以来就存在。参考here

您可以尝试将 Spring 版本升级到 5.0.0