JSON-RPC 2.0 参数校验应使用 Optional.ofNullable() 安全提取必填字段,链式调用 map/flatMap 处理嵌套结构,并通过 orElseThrow() 抛出含标准错误码(如-32602)的 JsonRpcException,由统一异常处理器生成合规 error 响应;Optional 不处理类型转换失败,需额外校验并复用相同异常出口。

在 JSON-RPC 2.0 协议中,当请求参数缺失、类型错误或业务校验失败时,需返回标准错误结构(如 {"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params"},"id":1})。Java 中结合 Optional 与 orElseThrow(),可简洁、声明式地实现这类“存在即用,否则抛定制异常”的逻辑,避免冗长的 null 判断和 if-else 嵌套。
用 Optional 包装关键参数提取结果
JSON-RPC 请求体通常解析为 Map<String, Object> 或 DTO。对必填字段(如 "method"、"params")做安全提取后,立即封装为 Optional:
- 使用
Map.get(key)后调用Optional.ofNullable(),而非直接判空 - 对嵌套结构(如
params中的"accountId"),可链式调用map()+flatMap()构建深层 Optional - 示例:
Optional<String> method = Optional.ofNullable(request.get("method")).map(Object::toString);
用 orElseThrow 抛出符合 JSON-RPC 错误码的异常
orElseThrow() 是触发错误响应的核心——它不只抛异常,更要抛「带协议语义」的异常:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 定义统一异常基类(如
JsonRpcException),含code(int)、message(String)字段 - 为每类缺失场景创建静态工厂方法:如
JsonRpcException.missingParam("method")返回 code=-32602 - 直接传入工厂方法引用:
method.orElseThrow(() -> JsonRpcException.missingParam("method"));
统一异常处理器映射到标准 error 结构
Spring MVC 或自定义 HTTP 处理器中,捕获 JsonRpcException 并生成合规响应体:
- 响应体必须包含
jsonrpc、error(含code和message)、id字段 - 确保
id从原始请求中透传(即使为null或"",也原样返回) - 避免在异常处理器里再抛新异常;所有校验失败都应收敛到
JsonRpcException及其子类
注意 Optional 的边界:不适用于类型转换失败
Optional 只解决「值是否存在」,不解决「值是否合法」。例如 "id": "abc" 是非数字字符串:
- 先用
Optional.ofNullable(request.get("id"))确保 key 存在 - 再用
map(Object::toString).filter(StringUtils::isNumeric).map(Long::parseLong)做类型+格式校验 - 校验失败时仍调用
orElseThrow(JsonRpcException::invalidParam),保持错误出口一致

















