OpenAPITools/openapi-generator · error · RuntimeException
" + operationId + " (reserved word) cannot be used as method
Error message
" + operationId + " (reserved word) cannot be used as method name
What it means
The scala-lagom-server-deprecated generator's toOperationId() checks the (non-empty) operationId against the Scala reserved word list; a reserved word cannot be used as a Scala method name, so generation throws RuntimeException naming the word.
Source
Thrown at modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaLagomServerCodegen.java:179
public String getName() {
return "scala-lagom-server-deprecated";
}
@Override
public String getHelp() {
return "Generates a Lagom API server (Beta) in scala. IMPORTANT: this generator has been deprecated";
}
@Override
public String toOperationId(String operationId) {
// throw exception if method name is empty
if (StringUtils.isEmpty(operationId)) {
throw new RuntimeException("Empty method name (operationId) not allowed");
}
// method name cannot use reserved keyword, e.g. return
if (isReservedWord(operationId)) {
throw new RuntimeException(operationId + " (reserved word) cannot be used as method name");
}
return camelize(operationId, LOWERCASE_FIRST_LETTER);
}
@Override
public ModelsMap postProcessModelsEnum(ModelsMap objs) {
objs = super.postProcessModelsEnum(objs);
for (ModelMap mo : objs.getModels()) {
CodegenModel cm = mo.getModel();
for (CodegenProperty var : cm.vars) {
if (var.isEnum) {
List<Object> enumValues = getEnumValues(var.allowableValues);
for (final ListIterator<Object> i = enumValues.listIterator(); i.hasNext(); ) {
final String element = String.valueOf(i.next());
i.set(element.replaceAll("^\"|\"$", ""));View on GitHub (pinned to fcec517be3)
Solutions
- Rename the operationId in the spec to something non-reserved, e.g. returnType -> getReturnType
- Use a multi-word operationId; camelization changes single reserved words but 'returnPolicy' is already safe
- Add a spec lint rule rejecting the target language's reserved words for operationIds
- If the wire operation name must stay, remember operationId only affects the generated method name, not the HTTP path
Example fix
# before
paths:
/returns/{id}:
get:
operationId: return
# after
paths:
/returns/{id}:
get:
operationId: getReturn Defensive patterns
Strategy: validation
Validate before calling
# Reject Scala reserved words as operationIds (Python):
SCALA_RESERVED = {'abstract','case','catch','class','def','do','else','extends','false','final',
'finally','for','forSome','if','implicit','import','lazy','match','new','null',
'object','override','package','private','protected','return','sealed','super',
'this','throw','trait','true','try','type','val','var','while','with','yield'}
for oid in all_operation_ids(spec):
assert oid not in SCALA_RESERVED, f'operationId {oid!r} is a Scala reserved word' Try / catch
try {
new DefaultGenerator().opts(input).generate();
} catch (RuntimeException e) {
// '<word> (reserved word) cannot be used as method name' - rename that operationId in the spec and rerun
} Prevention
- Use verb+noun operationIds (getUser, buildType) instead of bare keywords
- Keep a per-target-language reserved word list in your spec authoring guide
- Remember the HTTP path is unaffected by operationId, so renaming is API-safe
When it happens
Trigger: A spec operation with operationId: return / match / type / object / package / val / def / new / class etc., generated with -g scala-lagom-server-deprecated. camelize() does not save you: single-word identifiers pass through unchanged.
Common situations: REST operations named after language concepts ('get return policy', 'check type', 'create object') that camelCase to reserved words; specs authored by backend teams unfamiliar with Scala keywords; shared specs that generate fine for Python but fail for Scala.
Related errors
- Empty method name (operationId) not allowed
- " + operationId + " (reserved word) cannot be used as method
- Empty method name (operationId) not allowed
- DateLibrary " + dateLibrary + " is not supported. Please use
- unsupported status " + resp.code
AI-assisted analysis of OpenAPITools/openapi-generator@fcec517be3 (2026-08-22).
Data as JSON: /api/errors/1c26e5572b9989a8.
Report an issue: GitHub.