diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java index 452936d3992..2bc9c5ef8cb 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java @@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; +import java.util.regex.Matcher; import java.util.regex.Pattern; import static com.google.common.base.CaseFormat.LOWER_CAMEL; @@ -623,8 +624,18 @@ public class JavaClientCodegen extends AbstractJavaCodegen if (FEIGN.equals(getLibrary())) { Map operations = (Map) objs.get("operations"); List operationList = (List) operations.get("operation"); + Pattern methodPattern = Pattern.compile("^(.*):([^:]*)$"); for (CodegenOperation op : operationList) { String path = op.path; + String method = ""; + + // if a custom method is found at the end of the path, cut it off for later + Matcher m = methodPattern.matcher(path); + if (m.find()) { + path = m.group(1); + method = m.group(2); + } + String[] items = path.split("/", -1); for (int i = 0; i < items.length; ++i) { @@ -634,6 +645,10 @@ public class JavaClientCodegen extends AbstractJavaCodegen } } op.path = StringUtils.join(items, "/"); + // Replace the custom method on the path if one was found earlier + if (!method.isEmpty()) { + op.path += ":" + method; + } } } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index 998267dc417..f5daa8e207e 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -1079,4 +1079,31 @@ public class JavaClientCodegenTest { .filter(filter) .findFirst(); } + + @Test + public void testCustomMethodParamsAreCamelizedWhenUsingFeign() throws IOException { + + File output = Files.createTempDirectory("test").toFile(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(JavaClientCodegen.FEIGN) + .setInputSpec("src/test/resources/3_0/issue_7791.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(clientOptInput).generate(); + + TestUtils.ensureContainsFile(files, output, "src/main/java/org/openapitools/client/api/DefaultApi.java"); + + validateJavaSourceFiles(files); + + TestUtils.assertFileContains(Paths.get(output + "/src/main/java/org/openapitools/client/api/DefaultApi.java"), + "@RequestLine(\"POST /events/{eventId}:undelete\")"); + TestUtils.assertFileNotContains(Paths.get(output + "/src/main/java/org/openapitools/client/api/DefaultApi.java"), + "event_id"); + + output.deleteOnExit(); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_7791.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_7791.yaml new file mode 100644 index 00000000000..3065375ecc3 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_7791.yaml @@ -0,0 +1,20 @@ +openapi: 3.0.1 +info: + title: Custom methods + description: "Google custom methods syntax" + version: 0.0.1 + +paths: + /events/{event_id}:undelete: + post: + operationId: undeleteOperation + parameters: + - name: event_id + in: path + required: true + description: Event Id + schema: + type: number + responses: + 200: + description: success \ No newline at end of file