flowable/flowable-engine · error · FlowableImageException

Error while generating case image

Error message

Error while generating case image

What it means

DefaultDecisionRequirementsDiagramCanvas.generateImage wraps any IOException from ImageIO.write into a FlowableImageException with message 'Error while generating case image'. It signals the buffered diagram image could not be encoded into the requested image format.

Source

Thrown at modules/flowable-dmn-image-generator/src/main/java/org/flowable/dmn/image/impl/DefaultDecisionRequirementsDiagramCanvas.java:201

            LOGGER.warn("Could not load image for decision requirements diagram creation: {}", e.getMessage());
        }
    }

    /**
     * Generates an image of what currently is drawn on the canvas.
     *
     * Throws an {@link FlowableImageException} when {@link #close()} is already called.
     */
    public InputStream generateImage(String imageType) {
        if (closed) {
            throw new FlowableImageException("CaseDiagramGenerator already closed");
        }

        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            ImageIO.write(decisionRequirementsDiagram, imageType, out);
            return new ByteArrayInputStream(out.toByteArray());
        } catch (IOException e) {
            throw new FlowableImageException("Error while generating case image", e);
        }
    }

    /**
     * Generates an image of what currently is drawn on the canvas.
     *
     * Throws an {@link FlowableImageException} when {@link #close()} is already called.
     */
    public BufferedImage generateBufferedImage(String imageType) {
        if (closed) {
            throw new FlowableImageException("DecisionRequirementsDiagramGenerator already closed");
        }

        // Try to remove white space
        minX = (minX <= 5) ? 5 : minX;
        minY = (minY <= 5) ? 5 : minY;
        BufferedImage imageToSerialize = decisionRequirementsDiagram;
        imageToSerialize = decisionRequirementsDiagram.getSubimage(minX - 5, minY - 5, canvasWidth - minX + 5, canvasHeight - minY + 5);

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Use a supported imageType such as "png", "jpeg", or "gif".
  2. Check ImageIO.getWriterFormatNames() on the target JVM to confirm available formats.
  3. Inspect the wrapped IOException cause for the underlying encoding failure.

Example fix

// before
InputStream is = canvas.generateImage("jpg");
// after
InputStream is = canvas.generateImage("jpeg");
Defensive patterns

Strategy: validation

Validate before calling

boolean supported = java.util.Arrays.asList(javax.imageio.ImageIO.getWriterFormatNames()).contains(imageType.toLowerCase());
if (!supported) throw new IllegalArgumentException("Unsupported image type: " + imageType);

Try / catch

try {
    InputStream is = canvas.generateImage(imageType);
} catch (FlowableImageException e) {
    logger.error("Image encoding failed for type {}", imageType, e.getCause());
}

Prevention

When it happens

Trigger: Calling generateImage with an image type that has no ImageIO writer registered (e.g. unsupported string), or an I/O failure while writing the ByteArrayOutputStream.

Common situations: Passing a typo'd imageType like 'jpg ' or 'JPG' on a JVM without the corresponding writer; constrained environments missing image codecs.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


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