如何通过含冒号的键从Apache Ignite REST API获取值?
Apache Ignite REST API 取值异常问题解决
问题拆解
- 带冒号的key请求触发序列化异常:缓存中存储的对象包含
java.time.Instant类型,Ignite REST模块默认未集成Jackson的JSR310日期处理模块,导致序列化失败。 - 移除冒号后返回null:只是因为修改后的key不存在于缓存中,和序列化问题无关;Java客户端能正常取值是因为客户端本身已处理好Instant类型的序列化逻辑。
解决步骤
1. 添加Jackson JSR310依赖
确保Ignite节点的classpath中包含jackson-datatype-jsr310依赖,版本要和Ignite内置的Jackson版本一致(可通过查看Ignite依赖树确认匹配版本):
- Maven配置:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.15.2</version> <!-- 替换为与Ignite适配的版本 --> </dependency>
- Gradle配置:
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2'
2. 配置Ignite REST模块的ObjectMapper
在Ignite启动配置中,给REST协议的Jackson ObjectMapper注册JavaTimeModule,开启Java 8日期类型支持:
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.GridRestProtocolConfiguration; import org.apache.ignite.Ignition; public class IgniteRestConfig { public static void main(String[] args) { IgniteConfiguration cfg = new IgniteConfiguration(); GridRestProtocolConfiguration restCfg = new GridRestProtocolConfiguration(); restCfg.getJacksonMapper().registerModule(new JavaTimeModule()); cfg.setRestProtocolConfiguration(restCfg); Ignition.start(cfg); } }
3. 验证带冒号的key请求
重启Ignite节点后,将请求中的冒号进行URL编码(转为%3A),使用如下请求地址:
/ignite?cmd=get&cacheName=my-cache&key=some%3Akey
此时应能正常返回缓存值,不再触发序列化异常。
内容的提问来源于stack exchange,提问作者user432024
相关产品推荐
相关产品推荐

