{"record":{"id":"04aecc3f0a29db92","repo":"flowable/flowable-engine","slug":"could-not-find-graphic-info-for-decision-service","errorCode":null,"errorMessage":"Could not find graphic info for decision service: ${decisionServiceId}","messagePattern":"Could not find graphic info for decision service: (.+?)","errorType":"exception","errorClass":"FlowableImageException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-image-generator/src/main/java/org/flowable/dmn/image/impl/DefaultDecisionRequirementsDiagramGenerator.java","lineNumber":136,"sourceCode":"    public BufferedImage generatePngImage(DmnDefinition dmnDefinition, double scaleFactor) {\n        return generateImage(dmnDefinition, \"png\", scaleFactor);\n    }\n\n    protected DefaultDecisionRequirementsDiagramCanvas generateDecisionRequirementsDiagram(DmnDefinition dmnDefinition, String imageType,\n            String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) {\n\n        prepareDmnDefinition(dmnDefinition);\n\n        DefaultDecisionRequirementsDiagramCanvas decisionRequirementsDiagramCanvas = initDecisionRequirementsDiagramCanvas(dmnDefinition, imageType,\n                activityFontName, labelFontName, annotationFontName, customClassLoader);\n\n        // Draw elements\n        for (DecisionService decisionService : dmnDefinition.getDecisionServices()) {\n\n            GraphicInfo decisionServiceInfo = dmnDefinition.getGraphicInfo(decisionService.getId());\n\n            if (decisionServiceInfo == null) {\n                throw new FlowableImageException(\"Could not find graphic info for decision service: \" + decisionService.getId());\n            }\n\n            List<GraphicInfo> decisionServiceDividerInfos = dmnDefinition.getDecisionServiceDividerGraphicInfo(decisionService.getId());\n            decisionRequirementsDiagramCanvas.drawDecisionService(decisionService.getName(), decisionServiceInfo, decisionServiceDividerInfos, scaleFactor);\n\n            for (DmnElementReference decisionRef : decisionService.getOutputDecisions()) {\n                Decision decision = dmnDefinition.getDecisionById(decisionRef.getParsedId());\n\n                // draw decisions\n                drawDecision(decisionRequirementsDiagramCanvas, dmnDefinition, decision, scaleFactor);\n\n                // draw information requirements\n                for (InformationRequirement informationRequirement : decision.getRequiredDecisions()) {\n                    drawInformationRequirement(decisionRequirementsDiagramCanvas, dmnDefinition, informationRequirement, decision, scaleFactor);\n                }\n            }\n\n            for (DmnElementReference decisionRef : decisionService.getEncapsulatedDecisions()) {","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-image-generator/src/main/java/org/flowable/dmn/image/impl/DefaultDecisionRequirementsDiagramGenerator.java#L118-L154","documentation":"DefaultDecisionRequirementsDiagramGenerator.generateDecisionRequirementsDiagram throws FlowableImageException when a decision service in the DMN definition has no DI graphic info in the model. Diagram generation requires position/size metadata for every decision service.","triggerScenarios":"Generating a decision requirements diagram for a DRD whose DMN XML lacks a BPMNShape/DI entry for one of its decision services, then drawing elements.","commonSituations":"Hand-authored or programmatically built DMN models missing the DI section; converters or tools that strip diagram interchange information; malformed DMN files from third-party editors.","solutions":["Ensure the DMN XML contains DI elements (BPMNShape/BPMNEdge equivalents) for every decision service.","Re-export the model from a DMN editor that emits diagram interchange data.","Validate the DMN file's <DMNDI> section completeness before enabling diagram generation.","Skip diagram generation for definitions lacking DI info."],"exampleFix":"// before\nif (decisionServiceInfo == null) { /* engine throws */ }\n// after (caller-side guard)\nboolean hasDi = dmnDefinition.getDecisionServices().stream()\n    .allMatch(ds -> dmnDefinition.getGraphicInfo(ds.getId()) != null);\nif (hasDi) {\n    generator.generateDiagram(dmnDefinition);\n}","handlingStrategy":"validation","validationCode":"boolean allDi = dmnDefinition.getDecisionServices().stream()\n    .allMatch(ds -> dmnDefinition.getGraphicInfo(ds.getId()) != null);\nif (!allDi) { /* skip diagram generation or fix the model */ }","typeGuard":null,"tryCatchPattern":"try {\n    InputStream diagram = generator.generateDiagram(dmnDefinition);\n} catch (FlowableImageException e) {\n    logger.warn(\"DRD lacks DI info; skipping diagram\", e);\n}","preventionTips":["Always author DMN with a complete DMNDI/DI section","Re-export models from editors that emit diagram interchange data","Validate DMN files at deploy time for DI completeness"],"tags":["dmn","diagram","missing-di","dmn-di"],"backgroundTag":"resource-not-found","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}