flowable/flowable-engine · warning

Process should be validated, but no process validator is…

Error message

Process should be validated, but no process validator is configured on the process engine configuration!

What it means

During BpmnParse.execute, if process validation is requested (validateProcess) but the ProcessEngineConfiguration has no ProcessValidator configured, this warning is logged and semantic validation is skipped; deployment continues unvalidated.

Solutions

  1. Configure a ProcessValidator (e.g. DefaultProcessValidator / the core validator's validation set) on the process engine configuration
  2. Use ProcessEngineConfiguration's default validation rules for SetKeyIsEmpty, etc.
  3. If validation is intentionally not wanted, set validateProcess=false to silence the mismatch

Example fix

// before
processEngineConfig.setProcessValidator(null);
// after
processEngineConfig.setProcessValidator(new DefaultProcessValidator());
Defensive patterns

Strategy: validation

Validate before calling

if (cfg.isValidateProcess() && cfg.getProcessValidator() == null) {
    cfg.setProcessValidator(new DefaultProcessValidator());
}

Type guard

boolean validatorMissing(ProcessEngineConfiguration cfg) { return cfg.getProcessValidator() == null; }

Prevention

When it happens

Trigger: Deploying/parsing a BPMN model with process-level validation enabled while processValidator is null on the process engine configuration (common with the Activiti 5 compatibility engine where a validator was not wired).

Common situations: Minimal engine configurations that omit the default validation set; custom engine configurations in flowable5-engine compatibility mode.

Related errors


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

Appendix: source

Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/BpmnParse.java:172

            boolean enableSafeBpmnXml = false;
            String encoding = null;
            if (processEngineConfiguration != null) {
                enableSafeBpmnXml = processEngineConfiguration.isEnableSafeBpmnXml();
                encoding = processEngineConfiguration.getXmlEncoding();
            }

            if (encoding != null) {
                bpmnModel = converter.convertToBpmnModel(streamSource, validateSchema, enableSafeBpmnXml, encoding);
            } else {
                bpmnModel = converter.convertToBpmnModel(streamSource, validateSchema, enableSafeBpmnXml);
            }

            // XSD validation goes first, then process/semantic validation
            if (validateProcess) {
                ProcessValidator processValidator = processEngineConfiguration.getProcessValidator();
                if (processValidator == null) {
                    LOGGER.warn("Process should be validated, but no process validator is configured on the process engine configuration!");
                } else {
                    List<ValidationError> validationErrors = processValidator.validate(bpmnModel);
                    if (validationErrors != null && !validationErrors.isEmpty()) {

                        StringBuilder warningBuilder = new StringBuilder();
                        StringBuilder errorBuilder = new StringBuilder();

                        for (ValidationError error : validationErrors) {
                            if (error.isWarning()) {
                                warningBuilder.append(error);
                                warningBuilder.append("\n");
                            } else {
                                errorBuilder.append(error);
                                errorBuilder.append("\n");
                            }
                        }

                        // Throw exception if there is any error

View on GitHub (pinned to d6d39ce1c6)