{"record":{"id":"0622addc2122de27","repo":"iflytek/astron-agent","slug":"failed-to-normalize-publish-approval-snapshot-spaceid","errorCode":null,"errorMessage":"Failed to normalize publish approval snapshot spaceId","messagePattern":"Failed to normalize publish approval snapshot spaceId","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"console/backend/hub/src/main/java/com/iflytek/astron/console/hub/service/publish/impl/PublishApprovalServiceImpl.java","lineNumber":259,"sourceCode":"\n    private SpaceTypeEnum resolveSpaceType(Long spaceId) {\n        if (spaceId == null) {\n            return null;\n        }\n        return spaceService.getSpaceType(spaceId);\n    }\n\n    private void normalizePublishSnapshotSpaceId(PublishApprovalSubmitDto submitDto) {\n        if (StringUtils.isBlank(submitDto.getPublishSnapshot())) {\n            return;\n        }\n        try {\n            JSONObject snapshot = JSON.parseObject(submitDto.getPublishSnapshot());\n            snapshot.put(\"spaceId\", submitDto.getSpaceId());\n            submitDto.setPublishSnapshot(snapshot.toJSONString());\n        } catch (Exception ex) {\n            // Snapshot is auxiliary audit data; approval decisions use the normalized DTO spaceId.\n            log.warn(\"Failed to normalize publish approval snapshot spaceId\", ex);\n        }\n    }\n\n    private boolean isOwnerOrAdmin(SpaceRoleEnum role) {\n        return SpaceRoleEnum.OWNER == role || SpaceRoleEnum.ADMIN == role;\n    }\n\n    private boolean isApprovalEnabledPublishType(PublishApprovalTypeEnum publishType) {\n        return PublishApprovalTypeEnum.MARKET == publishType || PublishApprovalTypeEnum.API == publishType;\n    }\n\n    private void validateApprovalTarget(PublishApprovalSubmitDto submitDto) {\n        if (PublishApprovalResourceTypeEnum.BOT == submitDto.getResourceType()) {\n            Integer botId = parseBotId(submitDto.getResourceId());\n            int hasPermission = chatBotBaseMapper.checkBotPermission(\n                    botId,\n                    submitDto.getRequesterUid(),\n                    submitDto.getSpaceId());","sourceCodeStart":241,"sourceCodeEnd":277,"githubUrl":"https://github.com/iflytek/astron-agent/blob/5e758547a83371a5a4b29dadf4ac03e8dd527635/console/backend/hub/src/main/java/com/iflytek/astron/console/hub/service/publish/impl/PublishApprovalServiceImpl.java#L241-L277","documentation":"A warn log when the publish snapshot JSON in the submit DTO cannot be parsed or modified while injecting the normalized spaceId. Approval decisions are unaffected because they use the DTO's spaceId field; only the audit snapshot loses the spaceId injection.","triggerScenarios":"submitIfRequired is called with publishSnapshot that is null, empty, or invalid JSON, so JSON.parseObject throws.","commonSituations":"Clients posting approval submissions with a malformed or missing publishSnapshot field; older clients sending non-JSON snapshot payloads.","solutions":["Validate/serialize publishSnapshot as valid JSON on the client before submitting","Guard the normalization with a null/empty check before parsing","Log the offending snapshot content (truncated) to diagnose client payloads"],"exampleFix":"// before\nJSONObject snapshot = JSON.parseObject(submitDto.getPublishSnapshot());\n// after\nif (submitDto.getPublishSnapshot() != null && !submitDto.getPublishSnapshot().isBlank()) {\n    JSONObject snapshot = JSON.parseObject(submitDto.getPublishSnapshot());\n    snapshot.put(\"spaceId\", submitDto.getSpaceId());\n    submitDto.setPublishSnapshot(snapshot.toJSONString());\n}","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":["json","audit","validation"],"backgroundTag":"json-parse-error","analyzedSha":"5e758547a83371a5a4b29dadf4ac03e8dd527635","analyzedAt":"2026-09-12T08:03:51.356Z","contentChangedAt":"2026-09-12T08:03:51.356Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}