[BUG][JAVA][SPRING] instantiationTypes ignored in add…Item/put…Item helpers since 7.26.0, models no longer compile with custom typeMappings
维护者通常 1 天内回复
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 25/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 停滞
- 领域
- backend, build-system
调研方向
Start by reviewing PRs #25001, #25648, and #25649, then trace the Java and Spring pojo.mustache templates that render add<Name>Item and put<Name>Item helpers. Reproduce with the supplied OpenAPI schema and generation options, then compare the generated helpers with the configured instantiationTypes. Done means the generated Java models compile and use the configured container types when helpers initialize null fields.
由索引模型根据 Issue 内容生成。
描述
Bug Report Checklist
- Have you provided a full/minimal spec to reproduce the issue?
- Have you validated the input using an OpenAPI validator?
- Have you tested with the latest master to confirm the issue still exists?
- Have you searched for related issues/PRs?
- What's the actual output vs expected output?
- [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description
Since 7.26.0 the add<Name>Item and put<Name>Item helper methods of generated Java models always create an ArrayList or a HashMap. They no longer use the type configured with instantiationTypes. The field initializer still uses the configured type, so the two places in the same class disagree.
When typeMappings maps the container to a type that ArrayList or HashMap does not implement, the generated model does not compile. Our case is map=SequencedMap with instantiationTypes map=LinkedHashMap:
private SequencedMap<String, String> entries = new LinkedHashMap<>();
public Basket putEntriesItem(String key, String entriesItem) {
if (this.entries == null) {
this.entries = new HashMap<>(); // 7.25.0: new LinkedHashMap<>()
}
this.entries.put(key, entriesItem);
return this;
}
Basket.java:41: error: incompatible types: cannot infer type arguments for HashMap<>
this.entries = new HashMap<>();
^
reason: no instance(s) of type variable(s) K,V exist so that HashMap<K,V> conforms to SequencedMap<String,String>
Basket.java:70: error: incompatible types: cannot infer type arguments for ArrayList<>
this.tags = new ArrayList<>();
^
reason: no instance(s) of type variable(s) E exist so that ArrayList<E> conforms to Deque<String>
The effect is not limited to custom type mappings. With only --instantiation-types map=LinkedHashMap set, the field is declared as Map<String, String> entries = new LinkedHashMap<>() and the code compiles. But when the field is null at the time putEntriesItem is called (after setEntries(null), or after deserializing "entries": null), the helper now creates a HashMap, where 7.25.0 created a LinkedHashMap. From then on the map no longer keeps insertion order, although the option asks for it.
openapi-generator version
Regression. 7.25.0 is correct. 7.26.0, 7.27.0 and 7.28.0-SNAPSHOT (build 20261111.130840-62) are affected.
Reproduced with the spring and the java generator. #25001 changed the same lines in the other Java pojo.mustache templates, so I expect them to be affected as well.
OpenAPI declaration file content or url
openapi: 3.0.3
info:
title: instantiation types
version: 1.0.0
paths: {}
components:
schemas:
Basket:
type: object
properties:
entries:
type: object
additionalProperties:
type: string
tags:
type: array
items:
type: string
Generation Details
java -jar openapi-generator-cli.jar generate \
-i spec.yaml -g spring -o out \
--type-mappings map=SequencedMap,array=Deque \
--instantiation-types map=LinkedHashMap,array=ArrayDeque \
--import-mappings SequencedMap=java.util.SequencedMap,LinkedHashMap=java.util.LinkedHashMap,Deque=java.util.Deque,ArrayDeque=java.util.ArrayDeque \
--global-property models
The same options with -g java show the same result.
Steps to reproduce
- Generate with the spec and command above.
- Open
out/src/main/java/org/openapitools/model/Basket.java.
Expected, as generated by 7.25.0:
this.entries = new LinkedHashMap<>();
this.tags = new ArrayDeque<>();
Actual since 7.26.0:
this.entries = new HashMap<>();
this.tags = new ArrayList<>();
- Compile the model with JDK 21 or later: the two errors shown above.
Related issues/PRs
- #25001 (fix for #24993) introduced the change. I found no existing report.
Suggest a fix
Before #25001 the helpers rendered {{{defaultValue}}} and fell back to the literal type only when no default existed:
this.{{name}} = {{{defaultValue}}}{{^defaultValue}}new {{#uniqueItems}}LinkedHashSet{{/uniqueItems}}{{^uniqueItems}}HashMap{{/uniqueItems}}<>(){{/defaultValue}};
#25001 removed {{{defaultValue}}} from this line, so only the hard-coded type is left. My guess at the reason: defaultValue is not always an empty container. When the schema has a default, it is a container filled with those values (for example new ArrayList<>(Arrays.asList("red", "blue"))), and the helper needs an empty one.
The helper should create an empty container of the type set in instantiationTypes. The templates cannot see that type today. The generator could pass it to them as a new property, and the templates would keep ArrayList and HashMap for the case where no instantiation type is set.
- 主要语言
- Java
- 星标
- 26.9k
- 派生
- 7.8k
- 平均合并
- 2 天 10 小时
- 30 天内合并 PR
- 180
环境准备
在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。
- 提供 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
OpenAPITools/openapi-generator 的其他 Issue
-
Issue: Bug
难度 2/5 1-3 小时 新手友好度 80/100
OpenAPITools/openapi-generator#25643 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 82/100
OpenAPITools/openapi-generator#25640 ·
维护者通常 1 天内回复
-
[BUG][JAVA] Deprecated properties only get @Deprecated on the getter (base, feign, native, microprofile)可能已有人在做 @Inf1mum 于 2 天前认领。 未关闭Issue: Bug
难度 2/5 1-3 小时 新手友好度 82/100
OpenAPITools/openapi-generator#25567 ·
维护者通常 1 天内回复
-
[BUG][KOTLIN-SERVER] typeInfoAnnotation.mustache uses As.PROPERTY → discriminator property serialized twice可能已有人在做 @Inf1mum 于 9 天前认领。 未关闭Issue: Bug
难度 2/5 1-3 小时 新手友好度 62/100
OpenAPITools/openapi-generator#25524 · 1 条评论 ·
维护者通常 1 天内回复
-
[REQ][JAVA][resteasy] Support for Jackson 3 / useJackson3可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭Enhancement: Feature
难度 2/5 1-3 小时 新手友好度 78/100
OpenAPITools/openapi-generator#25364 ·
维护者通常 1 天内回复
查看 OpenAPITools/openapi-generator 的全部 Issue
相似的 Issue
-
bug emitter:client:csharp
难度 2/5 1-3 小时 新手友好度 84/100
microsoft/typespec#12572 · 1 条评论 · 1 个 reaction ·
维护者通常 1 天内回复
-
GCC 15.2: -Wcast-qual warning - cast discards const qualifier from pointer target type (H5trace.c)未关闭
难度 2/5 1-3 小时 新手友好度 73/100
维护者通常 1 天内回复
-
[Bug] RemotingHelper.connect swaps the socket send and receive buffer configuration可能已有人在做 @amalsaidov 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 82/100
维护者通常 1 天内回复
-
needs-area-label
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 2 天内回复
-
area/ai area/backend component/zeebe kind/task
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 1 天内回复