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

  1. Inspect the decision table's hitPolicy attribute in the deployed DMN XML
  2. If you overrode hitPolicyBehaviors in DmnEngineConfiguration, re-add the defaults via the engine's default configuration
  3. Upgrade Flowable if the hit policy is a newer type not supported by your engine version
  4. 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

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/9f7682af54865235. Report an issue: GitHub.