diff --git a/.chronus/changes/http-client-java-cast-null-sample-arguments-2026-09-15.md b/.chronus/changes/http-client-java-cast-null-sample-arguments-2026-09-15.md new file mode 100644 index 00000000000..3be7b203f1a --- /dev/null +++ b/.chronus/changes/http-client-java-cast-null-sample-arguments-2026-09-15.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-client-java" +--- + +Cast null arguments to their declared Java types in generated samples and tests so overloaded API calls are unambiguous. \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ClientMethodExampleWriter.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ClientMethodExampleWriter.java index 9a72c0e890d..a3dd6a8686d 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ClientMethodExampleWriter.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ClientMethodExampleWriter.java @@ -60,11 +60,11 @@ public ClientMethodExampleWriter(ClientMethod method, String clientVarName, Prox .filter(methodParameter -> !pageDetails.shouldHideParameter(methodParameter.getClientMethodParameter())) .collect(Collectors.toList()); } - List exampleNodes = methodParameters.stream() - .map(methodParameter -> parseNodeFromParameter(method, proxyMethodExample, methodParameter)) - .collect(Collectors.toList()); - - String parameterInvocations = exampleNodes.stream().map(nodeVisitor::accept).collect(Collectors.joining(", ")); + String parameterInvocations = methodParameters.stream() + .map(methodParameter -> ExampleWriterUtil.getParameterExpression( + methodParameter.getClientMethodParameter().getClientType(), + nodeVisitor.accept(parseNodeFromParameter(method, proxyMethodExample, methodParameter)))) + .collect(Collectors.joining(", ")); // assertion this.imports.add("org.junit.jupiter.api.Assertions"); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ExampleWriterUtil.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ExampleWriterUtil.java new file mode 100644 index 00000000000..f3eae5c9c0c --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ExampleWriterUtil.java @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.typespec.http.client.generator.core.template.example; + +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; + +final class ExampleWriterUtil { + private ExampleWriterUtil() { + } + + static String getParameterExpression(IType parameterType, String valueExpression) { + return "null".equals(valueExpression) ? String.format("(%s) null", parameterType) : valueExpression; + } +} diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ProtocolExampleWriter.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ProtocolExampleWriter.java index 9e6b72ec301..8d9377a5ccf 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ProtocolExampleWriter.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/example/ProtocolExampleWriter.java @@ -78,7 +78,8 @@ public ProtocolExampleWriter(ProtocolExample protocolExample) { // parameter values and required invocation on RequestOptions List params = new ArrayList<>(); for (ClientMethodParameter parameter : method.getParameters()) { - params.add(parameter.getClientType().defaultValueExpression()); + params.add(ExampleWriterUtil.getParameterExpression(parameter.getClientType(), + parameter.getClientType().defaultValueExpression())); } StringBuilder binaryDataStmt = new StringBuilder(); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/template/example/ExampleWriterUtilTests.java b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/template/example/ExampleWriterUtilTests.java new file mode 100644 index 00000000000..7801c2506a0 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/template/example/ExampleWriterUtilTests.java @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.typespec.http.client.generator.core.template.example; + +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ExampleWriterUtilTests { + @Test + public void typesNullParameterExpression() { + Assertions.assertEquals("(String) null", ExampleWriterUtil.getParameterExpression(ClassType.STRING, "null")); + } + + @Test + public void preservesNonNullParameterExpression() { + Assertions.assertEquals("\"value\"", ExampleWriterUtil.getParameterExpression(ClassType.STRING, "\"value\"")); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/builtin/generated/BuiltinOpRead.java b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/builtin/generated/BuiltinOpRead.java index d6e2abe2255..49a732399af 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/builtin/generated/BuiltinOpRead.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/builtin/generated/BuiltinOpRead.java @@ -5,6 +5,7 @@ package tsptest.builtin.generated; import com.azure.core.util.Configuration; +import java.time.OffsetDateTime; import tsptest.builtin.BuiltinClient; import tsptest.builtin.BuiltinClientBuilder; import tsptest.builtin.models.Builtin; @@ -14,7 +15,8 @@ public static void main(String[] args) { BuiltinClient builtinClient = new BuiltinClientBuilder().endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT")).buildClient(); // BEGIN:tsptest.builtin.generated.builtin-op-read.builtin-op-read - Builtin response = builtinClient.read(null, null, null, "myFilter", null, null); + Builtin response = builtinClient.read((String) null, (String) null, (OffsetDateTime) null, "myFilter", + (String) null, (String) null); // END:tsptest.builtin.generated.builtin-op-read.builtin-op-read } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/flatten/generated/FlattenOpSend.java b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/flatten/generated/FlattenOpSend.java index fca52e8cf66..9e5aef95871 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/flatten/generated/FlattenOpSend.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/flatten/generated/FlattenOpSend.java @@ -14,7 +14,7 @@ public static void main(String[] args) { FlattenClient flattenClient = new FlattenClientBuilder().endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT")).buildClient(); // BEGIN:tsptest.flatten.generated.send.flatten-op-send - flattenClient.send("myRequiredId", null, "myRequiredInput", 0, 50, new User("myOptionalUser")); + flattenClient.send("myRequiredId", (String) null, "myRequiredInput", 0, 50, new User("myOptionalUser")); // END:tsptest.flatten.generated.send.flatten-op-send } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/model/generated/ModelOpPutNested.java b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/model/generated/ModelOpPutNested.java index 8a31ccb2712..9527a3d8c35 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/model/generated/ModelOpPutNested.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/model/generated/ModelOpPutNested.java @@ -14,7 +14,7 @@ public static void main(String[] args) { ModelClient modelClient = new ModelClientBuilder().endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT")).buildClient(); // BEGIN:tsptest.model.generated.model-op-put-nested.model-op-put-nested - NestedModel response = modelClient.putNested(null); + NestedModel response = modelClient.putNested((NestedModel) null); // END:tsptest.model.generated.model-op-put-nested.model-op-put-nested } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/specialchars/generated/BuiltinOpRead.java b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/specialchars/generated/BuiltinOpRead.java index 4dd26ace46b..6b8396f7b2f 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/specialchars/generated/BuiltinOpRead.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/specialchars/generated/BuiltinOpRead.java @@ -15,7 +15,7 @@ public static void main(String[] args) { = new SpecialCharsClientBuilder().endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT")) .buildClient(); // BEGIN:tsptest.specialchars.generated.builtin-op-read.builtin-op-read - Resource response = specialCharsClient.read(null); + Resource response = specialCharsClient.read((String) null); // END:tsptest.specialchars.generated.builtin-op-read.builtin-op-read } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/versioning/generated/VersioningOpList.java b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/versioning/generated/VersioningOpList.java index 85f33ac976f..b71870bc745 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/versioning/generated/VersioningOpList.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/versioning/generated/VersioningOpList.java @@ -17,7 +17,7 @@ public static void main(String[] args) { = new VersioningClientBuilder().endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT")) .buildClient(); // BEGIN:tsptest.versioning.generated.versioning-op-list.versioning-op-list - PagedIterable response = versioningClient.list(Arrays.asList("name=name"), null); + PagedIterable response = versioningClient.list(Arrays.asList("name=name"), (String) null); // END:tsptest.versioning.generated.versioning-op-list.versioning-op-list } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpReadTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpReadTests.java index 8fa08f909c1..5d7c1819674 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpReadTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpReadTests.java @@ -4,6 +4,7 @@ package tsptest.builtin.generated; +import java.time.OffsetDateTime; import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; @@ -17,7 +18,8 @@ public final class BuiltinOpReadTests extends BuiltinClientTestBase { @Disabled public void testBuiltinOpReadTests() { // method invocation - Builtin response = builtinClient.read(null, null, null, "myFilter", null, null); + Builtin response = builtinClient.read((String) null, (String) null, (OffsetDateTime) null, "myFilter", + (String) null, (String) null); // response assertion Assertions.assertNotNull(response); diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/flatten/generated/FlattenOpSendTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/flatten/generated/FlattenOpSendTests.java index a968457260e..0e1eadc6385 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/flatten/generated/FlattenOpSendTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/flatten/generated/FlattenOpSendTests.java @@ -14,6 +14,6 @@ public final class FlattenOpSendTests extends FlattenClientTestBase { @Disabled public void testFlattenOpSendTests() { // method invocation - flattenClient.send("myRequiredId", null, "myRequiredInput", 0, 50, new User("myOptionalUser")); + flattenClient.send("myRequiredId", (String) null, "myRequiredInput", 0, 50, new User("myOptionalUser")); } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/model/generated/ModelOpPutNestedTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/model/generated/ModelOpPutNestedTests.java index 7b090e408a7..d42dca08f84 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/model/generated/ModelOpPutNestedTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/model/generated/ModelOpPutNestedTests.java @@ -17,7 +17,7 @@ public final class ModelOpPutNestedTests extends ModelClientTestBase { @Disabled public void testModelOpPutNestedTests() { // method invocation - NestedModel response = modelClient.putNested(null); + NestedModel response = modelClient.putNested((NestedModel) null); // response assertion Assertions.assertNotNull(response); diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/specialchars/generated/BuiltinOpReadTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/specialchars/generated/BuiltinOpReadTests.java index 528efd7f53a..6d8c14ca7e9 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/specialchars/generated/BuiltinOpReadTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/specialchars/generated/BuiltinOpReadTests.java @@ -15,7 +15,7 @@ public final class BuiltinOpReadTests extends SpecialCharsClientTestBase { @Disabled public void testBuiltinOpReadTests() { // method invocation - Resource response = specialCharsClient.read(null); + Resource response = specialCharsClient.read((String) null); // response assertion Assertions.assertNotNull(response); diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/versioning/generated/VersioningOpListTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/versioning/generated/VersioningOpListTests.java index a5a7574b420..71edf0fd3b4 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/versioning/generated/VersioningOpListTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/versioning/generated/VersioningOpListTests.java @@ -17,7 +17,7 @@ public final class VersioningOpListTests extends VersioningClientTestBase { @Disabled public void testVersioningOpListTests() { // method invocation - PagedIterable response = versioningClient.list(Arrays.asList("name=name"), null); + PagedIterable response = versioningClient.list(Arrays.asList("name=name"), (String) null); // response assertion Assertions.assertEquals(200, response.iterableByPage().iterator().next().getStatusCode());