{"record":{"id":"9f7682af54865235","repo":"flowable/flowable-engine","slug":"hitpolicy-behavior-s-not-configured","errorCode":null,"errorMessage":"HitPolicy behavior: %s not configured","messagePattern":"HitPolicy behavior: (.+?) not configured","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java","lineNumber":317,"sourceCode":"    }\n\n    protected String getExceptionMessage(Exception exception) {\n        Throwable rootCause = exception;\n        while (rootCause.getCause() != null) {\n            rootCause = rootCause.getCause();\n        }\n        return rootCause.getMessage();\n    }\n\n    protected AbstractHitPolicy getHitPolicyBehavior(HitPolicy hitPolicy) {\n        AbstractHitPolicy hitPolicyBehavior = hitPolicyBehaviors.get(hitPolicy.getValue());\n\n        if (hitPolicyBehavior == null) {\n            String hitPolicyBehaviorNotFoundMessage = String.format(\"HitPolicy behavior: %s not configured\", hitPolicy.getValue());\n\n            LOGGER.error(hitPolicyBehaviorNotFoundMessage);\n\n            throw new FlowableException(hitPolicyBehaviorNotFoundMessage);\n        }\n\n        return hitPolicyBehavior;\n    }\n\n    protected void sanityCheckDecisionTable(DecisionTable decisionTable) {\n        if (decisionTable.getHitPolicy() == HitPolicy.COLLECT && decisionTable.getAggregation() != null && decisionTable.getOutputs() != null) {\n            if (decisionTable.getOutputs().size() > 1) {\n                throw new FlowableException(String.format(\"HitPolicy: %s has aggregation: %s and multiple outputs. This is not supported\", decisionTable.getHitPolicy(), decisionTable.getAggregation()));\n            }\n            if (!\"number\".equals(decisionTable.getOutputs().get(0).getTypeRef())) {\n                throw new FlowableException(String.format(\"HitPolicy: %s has aggregation: %s needs output type number\", decisionTable.getHitPolicy(), decisionTable.getAggregation()));\n            }\n        }\n    }\n\n    @Override\n    public Map<String, AbstractHitPolicy> getHitPolicyBehaviors() {","sourceCodeStart":299,"sourceCodeEnd":335,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java#L299-L335","documentation":"The DMN engine looks up a HitPolicyBehavior implementation for the hit policy declared on the decision table; if none is registered it cannot process the table and throws this error. It only happens when the engine's hitPolicyBehaviors map lacks an entry for the declared policy.","triggerScenarios":"getHitPolicyBehavior is called by evaluateDecisionTable with a HitPolicy value that has no corresponding AbstractHitPolicy registered in the DmnEngineConfiguration's hitPolicyBehaviors map.","commonSituations":"Custom DMN engine configuration overriding setHitPolicyBehaviors() and dropping default behaviors; XML model with an unrecognized/unsupported hit policy value; corrupted or hand-edited DMN deployment.","solutions":["Inspect the decision table's hitPolicy attribute in the deployed DMN XML","If you overrode hitPolicyBehaviors in DmnEngineConfiguration, re-add the defaults via the engine's default configuration","Upgrade Flowable if the hit policy is a newer type not supported by your engine version","Correct the DMN XML to use a supported hit policy (UNIQUE, FIRST, PRIORITY, ANY, COLLECT, RULE ORDER, OUTPUT ORDER)"],"exampleFix":"// before\ndmnEngineConfig.setHitPolicyBehaviors(customMap); // missing defaults\n// after\nMap<String, AbstractHitPolicy> behaviors = new HashMap<>();\nbehaviors.putAll(new DefaultHitPolicyBehaviors()); // or engine defaults\nbehaviors.putAll(customMap);\ndmnEngineConfig.setHitPolicyBehaviors(behaviors);","handlingStrategy":"validation","validationCode":"String policy = decisionTable.getHitPolicy().getValue();\nDmnEngineConfiguration cfg = ...;\nif (!cfg.getHitPolicyBehaviors().containsKey(policy)) {\n  throw new IllegalStateException(\"unsupported hit policy: \" + policy);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never override setHitPolicyBehaviors without merging engine defaults","Only use hit policies supported by your Flowable version","Validate DMN files in CI before deployment"],"tags":["dmn","hit-policy","configuration","flowable"],"backgroundTag":"invalid-config-value","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"}