| 问题描述 | 实际并网容量点击保存并提交审核出现“运行时异常,请联系管理员” |
|---|---|
| 一级模块 | 实际并网信息 |
| 二级模块 | 实际并网容量信息 |
| 涉及类型 | 未特别标注(截图为集中式新能源-风电场站) |
| 严重性 | 严重 |
| 当前状态 | 5.1.已关闭 |
| 研发处理人员 | 陈文琛 |
| 复测情况 | 复测通过 |
saveInfo(),最终调用 projectActualApi.updatePlant(this.station) 提交到后端 /newenergy/sjbw/updatePlant。.toString(),未做空值防御,是触发该端点“运行时异常”的典型代码模式。SjbwAppService.java 第 969 行:String type = ObjectUtil.isNotEmpty(map.get("cnlx")) ? map.get("cnlx").toString() : map.get("type").toString();SjbwAppService.java 第 1039 行附近:String plantId = map.get("plantId").toString();(与第 970 行已用安全方式解析出的 plantId1 重复,但这里又用了一次不安全写法)说明:本条缺陷当前状态为“已关闭 / 复测通过”,即在当前 backup730/730backup 快照的基础上已经可以正常保存。但代码走读发现 updatePlant() 方法内仍保留着与该问题高度吻合的不安全写法——多处直接对 Map 取值后无判空就调用 .toString(),一旦前端传参里缺失某个字段(例如 type/cnlx 均为空,或 plantId 取值时机不对),就会抛出 NullPointerException,而该异常未被 updatePlant() 自身捕获,会一路冒泡到全局异常处理器,被转换成截图里看到的通用提示“运行时异常,请联系管理员!”,把具体原因完全掩盖掉。为避免同类问题再次出现,建议在这批直接取值的地方补齐防御性判断:
String type = ObjectUtil.isNotEmpty(map.get("cnlx"))
? map.get("cnlx").toString()
: map.get("type").toString();
String type = ObjectUtil.isNotEmpty(map.get("cnlx"))
? map.get("cnlx").toString()
: Objects.toString(map.get("type"), "");
if (StrUtil.isEmpty(type)) {
throw new ServiceException("提交数据缺少项目类型(type/cnlx),请刷新页面重试");
}
String plantId = map.get("plantId").toString();
String plantId = plantId1;
ServiceException)应直接把 e.getMessage() 原样返回给前端,而不是统一替换成“运行时异常,请联系管理员”,否则即便补齐了判空,用户依然看不到具体是哪个字段缺失,不利于自助定位问题(该问题在 Excel 第 22 行“发电单元信息导入报错”中同样出现,属于本系统的共性缺陷,建议一并排查全局异常处理逻辑)。