使用WSO2 DSS向Cassandra插入NULL值时遇NumberFormatException错误求助
你遇到的问题根源很明确:WSO2 DSS没有正确将你设置的默认值解析为Cassandra的NULL,而是错误传递了字符串"null",而code列是int类型,Cassandra尝试把字符串"null"转换为整数时直接触发了NumberFormatException。
问题细节拆解
你在DSS里把code列的默认值设为#{NULL},但这个写法会让DSS将其当作变量名解析——当找不到名为NULL的变量时,它就会把字符串"null"作为实际值传给Cassandra。而Cassandra的int类型列无法接受字符串格式的"null",自然就抛出了类型转换错误。
分步解决方案
你需要调整DSS的配置逻辑,让它正确传递SQL标准的NULL值给Cassandra,具体操作如下:
修改数据服务的参数配置
打开你的Cassandra.dbs配置文件,找到对应insert操作的code参数定义:- 把参数的
optional属性设为true(标记该参数为可选,允许不传入) - 将
defaultValue直接设置为NULL(注意不要加#{}包裹,这是SQL标准的空值写法)
示例参数配置片段:
<param name="code" sqlType="INTEGER" optional="true" defaultValue="NULL"/>- 把参数的
简化CQL语句的参数引用
对应的insert CQL语句保持简洁,直接引用参数即可:INSERT INTO logs.test (id, code) VALUES (:id, :code)当你不传入code参数时,DSS会自动将标准SQL NULL传递给Cassandra,而不是字符串"null"——你的表结构中code不是主键,本身允许存储NULL,所以Cassandra能正确处理这个值。
重新部署并测试
保存配置后重新部署Cassandra数据服务,再用你之前的请求调用:<p:test xmlns:p="http://ws.wso2.org/dataservice"> <xs:id xmlns:xs="http://ws.wso2.org/dataservice">1</xs:id> </p:test>这次应该能成功插入id为1、code为NULL的记录,不会再触发类型转换错误。
额外验证步骤
如果想确认Cassandra中是否正确存储了NULL,可以用CQL查询验证:
SELECT * FROM logs.test WHERE id = 1;
查询结果中code列的值会显示为小写的null,这是Cassandra中空值的标准表示。
内容的提问来源于stack exchange,提问作者Nicolas

