spring-projects/spring-ai · error · IllegalStateException
Neither template nor resource is set
Error message
Neither template nor resource is set
What it means
Validation guard in PromptTemplate.Builder.build(): neither a template string nor a template resource was supplied, so there is no prompt content to render and constructing the PromptTemplate would produce a useless object. It is a generic guard over the builder's own state — the faulty input is an empty builder (both this.template and this.resource left null). Fix by calling template(...) or resource(...) before build().
Source
Thrown at spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java:269
public Builder renderer(TemplateRenderer renderer) {
Assert.notNull(renderer, "renderer cannot be null");
this.renderer = renderer;
return this;
}
public PromptTemplate build() {
if (this.template != null && this.resource != null) {
throw new IllegalArgumentException("Only one of template or resource can be set");
}
else if (this.resource != null) {
return new PromptTemplate(this.resource, this.variables, this.renderer);
}
else if (this.template != null) {
return new PromptTemplate(this.template, this.variables, this.renderer);
}
else {
throw new IllegalStateException("Neither template nor resource is set");
}
}
}
}
View on GitHub (pinned to 98a7beda4f)
Solutions
- Call builder.template(...) with the template string
- Or call builder.resource(...) with a classpath/file Resource
Example fix
// before
PromptTemplate.builder().variables(Map.of("x", 1)).build();
// after
PromptTemplate.builder().template("Hello {x}").variables(Map.of("x", 1)).build(); Defensive patterns
Strategy: validation
Validate before calling
if (templateText == null && resource == null) throw new IllegalStateException("Provide a template or resource before building PromptTemplate"); Try / catch
try { return builder.build(); } catch (IllegalStateException e) { logger.error("no template source configured", e); throw e; } Prevention
- Always call .template(...) or .resource(...) before build()
- Validate configuration-driven template sources for null/empty early at startup
- Fail fast with a clear message rather than letting the builder throw
When it happens
Trigger: Calling PromptTemplate.builder().build() (or only setting variables/renderer) without calling template(...) or resource(...).
Common situations: Dynamically built templates where a condition skipped setting the source; builder reused after an earlier branch chose neither; configuration-driven code where the template property resolved to null and was silently skipped.
Understand the failure class
Background: "Must pass :limit option" / "Missing required option" — required option errors explained — this error's family across 41 libraries.
Related errors
- Neither template nor resource is set
- Sampling not supported by the client:
- Bean must not be null
- Bean must not be null
- Bean must not be null
AI-assisted analysis of spring-projects/spring-ai@98a7beda4f (2026-09-11).
Data as JSON: /api/errors/1e1ca11e652cb365.
Report an issue: GitHub.