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..cfdb7ec6e40 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -203,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; 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)) {