{"record":{"id":"6c8906a9e1adaf14","repo":"flowable/flowable-engine","slug":"hitpolicy-s-violated-no-output-values-present","errorCode":null,"errorMessage":"HitPolicy: %s violated; no output values present","messagePattern":"HitPolicy: (.+?) violated; no output values present","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/hitpolicy/HitPolicyOutputOrder.java","lineNumber":56,"sourceCode":"    }\n\n    @Override\n    public void composeDecisionResults(final ELExecutionContext executionContext) {\n        List<Map<String, Object>> ruleResults = new ArrayList<>(executionContext.getRuleResults().values());\n        \n        boolean outputValuesPresent = false;\n        for (Map.Entry<String, List<Object>> entry : executionContext.getOutputValues().entrySet()) {\n            List<Object> outputValues = entry.getValue();\n            if (outputValues != null && !outputValues.isEmpty()) {\n                outputValuesPresent = true;\n                break;\n            }\n        }\n        \n        if (!outputValuesPresent) {\n            String hitPolicyViolatedMessage = String.format(\"HitPolicy: %s violated; no output values present\", getHitPolicyName());\n            if (CommandContextUtil.getDmnEngineConfiguration().isStrictMode()) {\n                throw new FlowableException(hitPolicyViolatedMessage);\n            } else {\n                executionContext.getAuditContainer().setValidationMessage(hitPolicyViolatedMessage);\n            }\n        }\n\n        // sort on predefined list(s) of output values\n        ruleResults.sort((o1, o2) -> {\n            CompareToBuilder compareToBuilder = new CompareToBuilder();\n            for (Map.Entry<String, List<Object>> entry : executionContext.getOutputValues().entrySet()) {\n                List<Object> outputValues = entry.getValue();\n                if (outputValues != null && !outputValues.isEmpty()) {\n                    compareToBuilder.append(o1.get(entry.getKey()), o2.get(entry.getKey()),\n                            new OutputOrderComparator<>(outputValues.toArray(new Comparable[outputValues.size()])));\n                    compareToBuilder.toComparison();\n                }\n            }\n            return compareToBuilder.toComparison();\n        });","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/hitpolicy/HitPolicyOutputOrder.java#L38-L74","documentation":"HitPolicyOutputOrder.composeDecisionResults sorts matching rule outputs for the PRIORITY/OUTPUT ORDER hit policy; this requires output values to be present. If no rule execution produced output values, strict mode throws FlowableException('HitPolicy: OUTPUT ORDER violated; no output values present'), otherwise it sets a validation message on the audit container.","triggerScenarios":"Running a decision table with hit policy PRIORITY/OUTPUT ORDER where matched rules exist but their output entries carry no values (empty output expressions or outputs never assigned).","commonSituations":"Decision table rows with empty output cells; output expressions that evaluate to null/empty; incomplete DMN model authored in an external tool; wrong output column mapping after editing the table.","solutions":["Fill in output values for the rules that can match under this hit policy","Fix output expressions so they evaluate to non-empty values","Review the DMN XML for empty <outputEntry> elements and correct them","Test the table with the specific input values to confirm at least one matched rule yields an output"],"exampleFix":"// before (matched rule with empty output entry)\n<outputEntry expressionLanguage=\"juel\"><literalExpression/></outputEntry>\n// after\n<outputEntry expressionLanguage=\"juel\"><literalExpression>low</literalExpression></outputEntry>","handlingStrategy":"validation","validationCode":"// check every rule row has a non-empty output entry before deployment\nrules.forEach(r -> { if (r.getOutputEntries().stream().allMatch(o -> o == null || o.getValue().isEmpty())) throw new IllegalStateException(\"rule \" + r + \" has no output values\"); });","typeGuard":null,"tryCatchPattern":"try { decisionTable.execute(input); } catch (FlowableException e) { if (e.getMessage().contains(\"no output values present\")) { fillOutputValues(); } throw e; }","preventionTips":["Never leave output cells empty in PRIORITY/OUTPUT ORDER tables","Verify output expressions evaluate to non-null values","Validate the DMN model before deployment"],"tags":["dmn","hit-policy","decision-table","validation"],"backgroundTag":"schema-validation-failed","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}