From ffceacd406fc51bec17e5a09fe75537753a011e3 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Fri, 24 Jul 2026 10:16:49 +0800 Subject: [PATCH 1/2] feat(http-client-java): expose required-fields-as-ctor-args option to tspconfig Expose the 'required-fields-as-ctor-args' emitter option in tspconfig.yaml for data-plane. It controls whether required model properties are generated as constructor arguments. The default remains true. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 042a4299-1ab4-46bf-8b66-7ce223d6272c --- ...equired-fields-as-ctor-args-2026-7-24-10-11-0.md | 13 +++++++++++++ .../emitter/src/code-model-builder.ts | 1 + .../http/client/generator/TypeSpecPlugin.java | 3 +++ .../http/client/generator/model/EmitterOptions.java | 7 +++++++ 4 files changed, 24 insertions(+) create mode 100644 .chronus/changes/expose-required-fields-as-ctor-args-2026-7-24-10-11-0.md diff --git a/.chronus/changes/expose-required-fields-as-ctor-args-2026-7-24-10-11-0.md b/.chronus/changes/expose-required-fields-as-ctor-args-2026-7-24-10-11-0.md new file mode 100644 index 00000000000..d34df907ddd --- /dev/null +++ b/.chronus/changes/expose-required-fields-as-ctor-args-2026-7-24-10-11-0.md @@ -0,0 +1,13 @@ +--- +changeKind: feature +packages: + - "@typespec/http-client-java" +--- + +Expose the `required-fields-as-ctor-args` emitter option in `tspconfig.yaml`. It controls whether required model properties are generated as constructor arguments. The default remains `true`. + +```yaml +options: + "@typespec/http-client-java": + required-fields-as-ctor-args: false +``` diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index 45c7f96c285..d6b3bb5f4c9 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -191,6 +191,7 @@ export interface EmitterOptionsDev { "generate-tests"?: boolean; // customization + "required-fields-as-ctor-args"?: boolean; "partial-update"?: boolean; "models-subpackage"?: string; "custom-types"?: string; diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java index 9715173ef60..4e655fee97f 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java @@ -224,6 +224,9 @@ public TypeSpecPlugin(EmitterOptions options, boolean sdkIntegration) { if (options.getPartialUpdate() != null) { SETTINGS_MAP.put("partial-update", options.getPartialUpdate()); } + if (options.getRequiredFieldsAsConstructorArgs() != null) { + SETTINGS_MAP.put("required-fields-as-ctor-args", options.getRequiredFieldsAsConstructorArgs()); + } if (!CoreUtils.isNullOrEmpty(options.getServiceVersions())) { SETTINGS_MAP.put("service-versions", options.getServiceVersions()); } diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/model/EmitterOptions.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/model/EmitterOptions.java index 3d0509647a1..96dcbd0bb4d 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/model/EmitterOptions.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/model/EmitterOptions.java @@ -28,6 +28,7 @@ public class EmitterOptions implements JsonSerializable { private Boolean enableSyncStack = true; private Boolean streamStyleSerialization = true; private Boolean partialUpdate; + private Boolean requiredFieldsAsConstructorArgs; private String customTypes; private String customTypeSubpackage; private String customizationClass; @@ -85,6 +86,10 @@ public Boolean getPartialUpdate() { return partialUpdate; } + public Boolean getRequiredFieldsAsConstructorArgs() { + return requiredFieldsAsConstructorArgs; + } + public Boolean getGenerateTests() { return generateTests; } @@ -237,6 +242,8 @@ public static EmitterOptions fromJson(JsonReader jsonReader) throws IOException options.streamStyleSerialization = reader.getNullable(EmitterOptions::getBoolean); } else if ("partial-update".equals(fieldName)) { options.partialUpdate = reader.getNullable(EmitterOptions::getBoolean); + } else if ("required-fields-as-ctor-args".equals(fieldName)) { + options.requiredFieldsAsConstructorArgs = reader.getNullable(EmitterOptions::getBoolean); } else if ("custom-types".equals(fieldName)) { options.customTypes = emptyToNull(reader.getString()); } else if ("custom-types-subpackage".equals(fieldName)) { From efcd76cc0f6aa968aecef6630eaaa4868efbb23a Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Fri, 24 Jul 2026 10:19:07 +0800 Subject: [PATCH 2/2] chore(http-client-java): move required-fields-as-ctor-args to 'not recommended to set' Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 042a4299-1ab4-46bf-8b66-7ce223d6272c --- packages/http-client-java/emitter/src/code-model-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index d6b3bb5f4c9..cfdb7ec6e40 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -191,7 +191,6 @@ export interface EmitterOptionsDev { "generate-tests"?: boolean; // customization - "required-fields-as-ctor-args"?: boolean; "partial-update"?: boolean; "models-subpackage"?: string; "custom-types"?: string; @@ -204,6 +203,7 @@ export interface EmitterOptionsDev { "enable-subclient"?: boolean; // not recommended to set + "required-fields-as-ctor-args"?: boolean; "group-etag-headers"?: boolean; "enable-sync-stack"?: boolean; "stream-style-serialization"?: boolean;