【问题标题】:IllegalArgumentException: columnname is not a field defined in this UDTIllegalArgumentException:列名不是此 UDT 中定义的字段
【发布时间】:2019-12-08 14:59:23
【问题描述】:

我有如下表结构

@Table(value = "employee")
public class Employee implements MapIdentifiable{

    @PrimaryKeyColumn(value = "employee_id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private String empId;

    @Column(value="info")
    @CassandraType(type = DataType.Name.UDT, userTypeName = "emp_info")
    private EmployeeInfo info;

// getters & setters
}

@UserDefinedType(value = "emp_info")
public class EmployeeInfo {

  @CassandraType(type = DataType.Name.TEXT, userTypeName = "employee_name")
  private String employeeName

// getters & setters
}

每当我尝试执行repository.save(emp) 时,都会收到以下错误IllegalArgumentException: employeename is not a field defined in this UDT.

我的代码或数据库中没有引用任何名为“employeename”的字段,但出现上述错误。

我尝试过重新创建整个架构和表,但没有成功。

我的maven依赖如下

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-cassandra</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-core</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-mapping</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-extras</artifactId>
            <version>3.7.1</version>
        </dependency>

如果我从字段名称中删除下划线,则相同的代码可以工作。我无法弄清楚我的代码在我的字段名称中没有使用下划线。

如果我遗漏了任何要分享的信息,请告诉我。

我的堆栈跟踪,

java.lang.IllegalArgumentException: employeename is not a field defined in this UDT
web_1  |    at com.datastax.driver.core.UDTValue.getAllIndexesOf(UDTValue.java:47)
web_1  |    at com.datastax.driver.core.AbstractData.set(AbstractData.java:535)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.writeUDTValueWhereFromObject(MappingCassandraConverter.java:495)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.write(MappingCassandraConverter.java:353)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.getWriteValue(MappingCassandraConverter.java:769)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.getWriteValue(MappingCassandraConverter.java:711)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.writeMapFromWrapper(MappingCassandraConverter.java:368)
web_1  |    at org.springframework.data.cassandra.core.convert.MappingCassandraConverter.write(MappingCassandraConverter.java:343)
web_1  |    at org.springframework.data.cassandra.repository.support.InsertUtil.createInsert(InsertUtil.java:52)
web_1  |    at org.springframework.data.cassandra.repository.support.SimpleCassandraRepository.createInsert(SimpleCassandraRepository.java:110)
web_1  |    at org.springframework.data.cassandra.repository.support.SimpleCassandraRepository.save(SimpleCassandraRepository.java:77)
web_1  |    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
web_1  |    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
web_1  |    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
web_1  |    at java.lang.reflect.Method.invoke(Method.java:498)
web_1  |    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:377)
web_1  |    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200)
web_1  |    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:641)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:605)
web_1  |    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:590)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
web_1  |    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
web_1  |    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
web_1  |    at com.sun.proxy.$Proxy136.save(Unknown Source)
web_1  |    at com.hindol.service.EmployeeServiceImpl.createEmployee(EmployeeServiceImpl.java:31)
web_1  |    at com.hindol.EmployeeController.saveEmployee(EmployeeController.java:72)

【问题讨论】:

  • 你能附上堆栈跟踪吗?
  • 当然。添加了我的堆栈跟踪。

标签: cassandra spring-data-jpa spring-data-cassandra


【解决方案1】:

employeename 来自您映射的 UDT EmployeeInfo,因为它包含属性

private String employeeName

要更改 UDT 字段的名称,请联系我们@Column(…)

【讨论】:

  • 感谢您的帮助。现在已经解决了。我确实使用了错误的属性。
【解决方案2】:

在我将另一个字段添加到 @UserDefinedType 类后尝试运行我的 Spring 应用程序时遇到此错误。我的 Spring 应用没有更新我的 UDT 结构,所以我必须手动更新。

如果您的项目是全新的,您可以简单地从 Cassandra 中删除表和 UDT,然后让您的 Spring 应用再次运行以重新创建数据模型:

DROP TABLE employee;

DROP TYPE emp_info;

但是,如果您不能简单地删除并重新创建表,则必须使用 ALTER TYPE 命令来更新您的 UDT 结构。详情请见documentation

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多