Java15使用EmbeddedCassandraServerHelper执行预编译语句报错咨询
Java 15与EmbeddedCassandraServerHelper的兼容性问题分析
确实存在兼容性问题,这个报错的核心原因是Java 15对**隐藏类(Hidden Classes)**的反射访问限制做了收紧,而你使用的cassandra-unit 4.3.1.0依赖的Cassandra版本并未适配这一变化。
错误根源解析
报错信息里的java.lang.UnsupportedOperationException: can't get field offset on a hidden class是关键:
Cassandra内部的ClusteringComparator会生成Lambda表达式,Java 15会将Lambda对应的类标记为隐藏类;旧版本Cassandra的反射逻辑尝试获取隐藏类的字段偏移量,这在Java 15中被禁止,直接触发了这个异常。
解决方案
- 升级cassandra-unit版本
更换为已适配Java 15的cassandra-unit版本(比如4.3.1.1及后续版本),新版本会修复隐藏类的反射访问问题。 - 添加JVM启动参数临时绕过
如果暂时无法升级,可以在测试的JVM启动参数中添加:
该参数解除了对--add-opens java.base/java.lang.invoke=ALL-UNNAMEDjava.lang.invoke包的反射访问限制,允许旧版本Cassandra的逻辑正常访问隐藏类字段。 - 保持驱动版本兼容
升级cassandra-unit后,确认java-driver-core版本与其匹配,避免出现新的兼容性问题。
相关代码与错误信息
报错详情
All 1 node(s) tried for the query failed (showing first 1 nodes, use getAllErrors() for more): Node(endPoint=localhost/127.0.0.1:9142, hostId=4e8b27ae-79f5-496a-a4ed-8ce0cb7bbb32, hashCode=aa1d75e): [com.datastax.oss.driver.api.core.servererrors.ServerError: java.lang.UnsupportedOperationException: can't get field offset on a hidden class: private final org.apache.cassandra.db.ClusteringComparator org.apache.cassandra.db.ClusteringComparator$$Lambda$143/0x0000000800d87768.arg$1]
测试代码
public CqlSession cqlSession; @Before public void setUp() throws Exception { EmbeddedCassandraServerHelper.startEmbeddedCassandra(); cqlSession = EmbeddedCassandraServerHelper.getSession(); new CQLDataLoader(cqlSession) .load(new ClassPathCQLDataSet("people.cql")); PreparedStatement ps = cqlSession.prepare("INSERT INTO person(id, name) values(?,?)"); BoundStatement bs = ps.bind("1234","Mike"); cqlSession.execute(bs); }
表结构CQL(people.cql)
CREATE TABLE person( id varchar, name varchar, PRIMARY KEY(id));
内容的提问来源于stack exchange,提问作者Andriy
相关产品推荐
相关产品推荐

