flowable/flowable-engine · error · FlowableException
HitPolicy behavior: not configured
Error message
HitPolicy behavior: %s not configured
What it means
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.
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)
Example fix
// before dmnEngineConfig.setHitPolicyBehaviors(customMap); // missing defaults // after Map<String, AbstractHitPolicy> behaviors = new HashMap<>(); behaviors.putAll(new DefaultHitPolicyBehaviors()); // or engine defaults behaviors.putAll(customMap); dmnEngineConfig.setHitPolicyBehaviors(behaviors);
Defensive patterns
Strategy: validation
Validate before calling
String policy = decisionTable.getHitPolicy().getValue();
DmnEngineConfiguration cfg = ...;
if (!cfg.getHitPolicyBehaviors().containsKey(policy)) {
throw new IllegalStateException("unsupported hit policy: " + policy);
} Prevention
- Never override setHitPolicyBehaviors without merging engine defaults
- Only use hit policies supported by your Flowable version
- Validate DMN files in CI before deployment
When it happens
Trigger: getHitPolicyBehavior is called by evaluateDecisionTable with a HitPolicy value that has no corresponding AbstractHitPolicy registered in the DmnEngineConfiguration's hitPolicyBehaviors map.
Common situations: 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.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- decision table does not contain a hit policy
- decisionTableReferenceKey is a required field extension for…
- DMN decision with key
- Dmn engine is not configured
- DMN repository service is not available
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/9f7682af54865235.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java:317
}
protected String getExceptionMessage(Exception exception) {
Throwable rootCause = exception;
while (rootCause.getCause() != null) {
rootCause = rootCause.getCause();
}
return rootCause.getMessage();
}
protected AbstractHitPolicy getHitPolicyBehavior(HitPolicy hitPolicy) {
AbstractHitPolicy hitPolicyBehavior = hitPolicyBehaviors.get(hitPolicy.getValue());
if (hitPolicyBehavior == null) {
String hitPolicyBehaviorNotFoundMessage = String.format("HitPolicy behavior: %s not configured", hitPolicy.getValue());
LOGGER.error(hitPolicyBehaviorNotFoundMessage);
throw new FlowableException(hitPolicyBehaviorNotFoundMessage);
}
return hitPolicyBehavior;
}
protected void sanityCheckDecisionTable(DecisionTable decisionTable) {
if (decisionTable.getHitPolicy() == HitPolicy.COLLECT && decisionTable.getAggregation() != null && decisionTable.getOutputs() != null) {
if (decisionTable.getOutputs().size() > 1) {
throw new FlowableException(String.format("HitPolicy: %s has aggregation: %s and multiple outputs. This is not supported", decisionTable.getHitPolicy(), decisionTable.getAggregation()));
}
if (!"number".equals(decisionTable.getOutputs().get(0).getTypeRef())) {
throw new FlowableException(String.format("HitPolicy: %s has aggregation: %s needs output type number", decisionTable.getHitPolicy(), decisionTable.getAggregation()));
}
}
}
@Override
public Map<String, AbstractHitPolicy> getHitPolicyBehaviors() {View on GitHub (pinned to d6d39ce1c6)