{"record":{"id":"2b08ba3c10c5a796","repo":"apache/dolphinscheduler","slug":"project-parameter-not-exists","errorCode":"PROJECT_PARAMETER_NOT_EXISTS","errorMessage":"PROJECT_PARAMETER_NOT_EXISTS","messagePattern":"PROJECT_PARAMETER_NOT_EXISTS","errorType":"error_code","errorClass":"ServiceException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectParameterServiceImpl.java","lineNumber":214,"sourceCode":"        if (StringUtils.isEmpty(codes)) {\n            log.error(\"Project parameter codes is empty, projectCode is {}.\", projectCode);\n            putMsg(result, Status.PROJECT_PARAMETER_CODE_EMPTY);\n            return result;\n        }\n\n        Set<Long> requestCodeSet = Lists.newArrayList(codes.split(Constants.COMMA)).stream().map(Long::parseLong)\n                .collect(Collectors.toSet());\n        List<ProjectParameter> projectParameterList = projectParameterMapper.queryByCodes(requestCodeSet);\n        Set<Long> actualCodeSet =\n                projectParameterList.stream().map(ProjectParameter::getCode).collect(Collectors.toSet());\n        // requestCodeSet - actualCodeSet\n        Set<Long> diffCode =\n                requestCodeSet.stream().filter(code -> !actualCodeSet.contains(code)).collect(Collectors.toSet());\n\n        String diffCodeString = diffCode.stream().map(String::valueOf).collect(Collectors.joining(Constants.COMMA));\n        if (CollectionUtils.isNotEmpty(diffCode)) {\n            log.error(\"Project parameter does not exist, codes:{}.\", diffCodeString);\n            throw new ServiceException(Status.PROJECT_PARAMETER_NOT_EXISTS, diffCodeString);\n        }\n\n        for (ProjectParameter projectParameter : projectParameterList) {\n            this.deleteProjectParametersByCode(loginUser, projectCode, projectParameter.getCode());\n        }\n\n        putMsg(result, Status.SUCCESS);\n        return result;\n    }\n\n    @Override\n    public Result queryProjectParameterListPaging(User loginUser, long projectCode, Integer pageSize, Integer pageNo,\n                                                  String searchVal, String projectParameterDataType) {\n        Result result = new Result();\n\n        Project project = projectDao.queryByCode(projectCode);\n        projectService.checkProjectAndAuthThrowException(loginUser, project, PROJECT);\n","sourceCodeStart":196,"sourceCodeEnd":232,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectParameterServiceImpl.java#L196-L232","documentation":"Thrown by ProjectParameterServiceImpl.batchDeleteProjectParametersByCodes when some requested parameter codes do not exist under the given project. The missing codes are joined into a comma string and passed as the exception argument.","triggerScenarios":"Calling POST /project-parameter/batch-delete with codes that are not present in t_ds_project_parameter for the given projectCode - already deleted, wrong project, or codes belonging to workflow/task-level parameters instead.","commonSituations":"Batch delete built from a stale UI list after another user deleted parameters; codes copied from a different project; ID-vs-code confusion (passing primary keys instead of parameter codes).","solutions":["Cross-check requested codes against the project's parameter list (queryProjectParameters) and remove the missing ones.","Verify you are using parameter codes, not database IDs, and the correct projectCode.","Re-fetch the parameter list before each batch delete to avoid stale codes.","If partial deletion is acceptable, diff codes client-side and only send existing ones."],"exampleFix":"// before\nprojectParameterService.batchDeleteProjectParametersByCodes(loginUser, projectCode, allCodes);\n// after\nList<ProjectParameter> existing = projectParameterService.queryProjectParameters(loginUser, projectCode, searchVal);\nSet<Long> validCodes = existing.stream().map(ProjectParameter::getCode).collect(Collectors.toSet());\nSet<Long> deletable = allCodes.stream().filter(validCodes::contains).collect(Collectors.toSet());\nprojectParameterService.batchDeleteProjectParametersByCodes(loginUser, projectCode, deletable);","handlingStrategy":"validation","validationCode":"List<ProjectParameter> existing =\n    projectParameterService.queryProjectParameters(loginUser, projectCode, \"\");\nSet<Long> validCodes = existing.stream()\n    .map(ProjectParameter::getCode).collect(Collectors.toSet());\nSet<Long> toDelete = requestedCodes.stream()\n    .filter(validCodes::contains).collect(Collectors.toSet());","typeGuard":null,"tryCatchPattern":"try {\n    projectParameterService.batchDeleteProjectParametersByCodes(loginUser, projectCode, codes);\n} catch (ServiceException e) {\n    // PROJECT_PARAMETER_NOT_EXISTS - e message lists missing codes\n}","preventionTips":["Re-fetch the parameter list immediately before batch delete.","Use parameter codes, not primary keys.","Ensure codes belong to the target project."],"tags":["dolphinscheduler","project-parameter","batch-delete"],"backgroundTag":"record-not-found","analyzedSha":"02eac45a1b6676e639fcbfb4be2243de5771b05d","analyzedAt":"2026-09-06T17:43:00.555Z","contentChangedAt":"2026-09-06T17:43:00.555Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}