flowable/flowable-engine · error · FlowableException
HitPolicy behavior: %s 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.
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)
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
- DMN repository service is not available
- Dmn engine is not configured
- more than one result in decision:
- more than one result
- HitPolicy: %s has aggregation: %s and multiple outputs. This
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/9f7682af54865235.
Report an issue: GitHub.