{"record":{"id":"61371eaad4c4ad62","repo":"quarkusio/quarkus","slug":"engine-not-set-61371e","errorCode":null,"errorMessage":"Engine not set","messagePattern":"Engine not set","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"independent-projects/qute/core/src/main/java/io/quarkus/qute/StrEvalNamespaceResolver.java","lineNumber":81,"sourceCode":"            });\n        }\n        return ret;\n    }\n\n    @Override\n    public int getPriority() {\n        return priority;\n    }\n\n    @Override\n    public String getNamespace() {\n        return \"str\";\n    }\n\n    private Template parse(String contents, Variant variant) {\n        Engine e = engine;\n        if (e == null) {\n            throw new IllegalStateException(\"Engine not set\");\n        }\n        return e.parse(contents, variant);\n    }\n\n    private void resolve(CompletableFuture<Object> ret, EvalContext context, Template template) {\n        template.getRootNode().resolve(context.resolutionContext()).whenComplete((r, t) -> {\n            if (t != null) {\n                ret.completeExceptionally(t);\n            } else {\n                StringBuilder sb = new StringBuilder();\n                r.process(sb::append);\n                ret.complete(new RawString(sb.toString()));\n            }\n        });\n    }\n\n}\n","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/qute/core/src/main/java/io/quarkus/qute/StrEvalNamespaceResolver.java#L63-L99","documentation":"StrEvalNamespaceResolver's str: namespace parses strings as templates, but it only has an Engine reference after being initialized by the engine builder. Calling parse before initialization throws IllegalStateException(\"Engine not set\").","triggerScenarios":"Resolving a str: expression (e.g. {str:'...'} or nested evaluation) before the resolver was added to an Engine and the engine injected back — e.g. using the resolver standalone, or resolving during engine construction.","commonSituations":"Using StrEvalNamespaceResolver outside a fully built Engine (manual instantiation without EngineBuilder.addNamespaceResolver); calling template evaluation inside a build/initialization callback before EngineBuilder.build() completes.","solutions":["Register the resolver via EngineBuilder.addNamespaceResolver(...) so the engine sets the engine reference during build, then only evaluate templates after build() returns.","Never resolve str: expressions from within engine construction callbacks or static initializers.","If using the resolver manually, ensure the EngineBuilder.build() has completed and assigned the engine before any resolution."],"exampleFix":"// before\nEngine engine = Engine.builder().build();\nnew StrEvalNamespaceResolver().parse(\"...\"); // engine never injected\n\n// after\nEngine engine = Engine.builder()\n        .addNamespaceResolver(new StrEvalNamespaceResolver())\n        .build(); // resolver initialized, str: works\nengine.parse(\"...\");","handlingStrategy":"try-catch","validationCode":"// resolve str: expressions only after EngineBuilder.build() has returned\nEngine engine = builder.addNamespaceResolver(new StrEvalNamespaceResolver()).build();","typeGuard":null,"tryCatchPattern":"try {\n    Object value = evaluateTemplate(template);\n} catch (IllegalStateException e) {\n    if (\"Engine not set\".equals(e.getMessage())) {\n        // defer evaluation until the engine is built/initialized\n    } else {\n        throw e;\n    }\n}","preventionTips":["Always register StrEvalNamespaceResolver via EngineBuilder, never instantiate-and-use standalone","Never evaluate templates during engine construction","Gate resolution code behind an 'engine ready' flag set after build()"],"tags":["qute","illegal-state","lifecycle","namespace-resolver"],"backgroundTag":"resolver-not-initialized","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}