Scala版Spring Data Cassandra复合主键注解未识别问题求助
解决Scala中Spring Data Cassandra复合主键注解识别问题
我之前也踩过Scala与Spring Data注解兼容的类似坑,你的问题核心是Scala的关键字type在注解参数中用反引号包裹后,Spring Data的注解解析器无法正确识别参数名——毕竟Java和Scala的编译元数据处理逻辑有差异,而Java版本能正常运行,就是因为Java里type不是关键字,注解参数能直接被解析。
下面给你几个可行的解决思路:
1. 使用位置参数替代命名参数(最快捷)
@PrimaryKeyColumn注解的第一个参数就是type,你可以直接传入枚举值,不用写参数名,绕开关键字的问题:
@PrimaryKeyClass case class SampleKey( @PrimaryKeyColumn(PrimaryKeyType.PARTITIONED, ordinal = 0, name = "id") id: Int, @PrimaryKeyColumn(PrimaryKeyType.CLUSTERED, ordinal = 1, name = "name") name: String )
这样Spring Data就能正确识别分区键和集群键的类型,完全不用处理关键字相关的兼容问题。
2. 开启Scala编译的参数名保留选项
如果一定要用命名参数的写法,你需要让Scala编译时保留参数名,这样Spring的反射机制才能正确识别带反引号的type参数。根据你的构建工具添加对应配置:
- sbt:在
build.sbt中添加scalacOptions += "-parameters" - Maven:在
scala-maven-plugin的配置中添加<configuration> <args> <arg>-parameters</arg> </args> </configuration>
开启后,Spring就能正确解析@PrimaryKeyColumn(type = ...)这种写法了。
3. 应急 fallback:改用普通类(不推荐)
如果前两种方案都不生效,可能是Spring Data Cassandra对Scala case class的反射处理存在兼容问题,可以把主键类改成普通类,并添加Spring要求的无参构造函数:
@PrimaryKeyClass class SampleKey( @PrimaryKeyColumn(`type` = PrimaryKeyType.PARTITIONED, ordinal = 0, name = "id") var id: Int, @PrimaryKeyColumn(`type` = PrimaryKeyType.CLUSTERED, ordinal = 1, name = "name") var name: String ) { // 必须提供无参构造函数 def this() = this(0, "") }
不过这种写法破坏了Scala的函数式风格,只建议作为临时应急方案。
修改后可以验证一下:启动应用后,检查Spring Data是否能正确映射主键,或者用CassandraMappingContext打印实体元数据,确认分区键和集群键被正确识别。
内容的提问来源于stack exchange,提问作者Himanshu Ahire
相关产品推荐
相关产品推荐

