Sannu
Sannu

Reputation: 1276

Swagger codegen - change api and controller class name

I am trying to generate rest code for spring using swagger. Currently generate api is V10Api.java and controller is V10ApiController.java. I want to have custom prefix as 'ReadApi.java' and 'ReadApiController.java'.

I looked at the solution here to implement this, so my code was:

public class ReadApiSpringCodeGen extends SpringCodegen
{
    static {
        PREFIX="Read"; //compile error at PREFIX
    }
}

it gives compilation error at PREFIX so i am guessing PREFIX is not in superclass.

I modified the class to over toApiName() method:

public class ReadApiSpringCodeGen extends SpringCodegen
{
    @Override
    public String toApiName(String name) {
        System.out.println("Name in is ["+name+"]");
        if (name.length() == 0) {
            return "DefaultApi";
        }
        name = sanitizeName(name);
        return camelize(name) + "Read";
    }

   public static void main(String[] args)
   {
       System.out.println("Main called");
   }
}

When ran the code generator as:

${JAVA_HOME}/bin/java -cp .:./swagger-codegen-cli-2.2.1.jar \
-jar swagger-codegen-cli-2.2.1.jar generate \
    -i Read.yaml \
    -l com.foo.swag.codegen.swagger.ReadApiSpringCodeGen \
....

I get the error:

Exception in thread "main" java.lang.RuntimeException: Can't load config class with name com.foo.swag.codegen.swagger.ReadApiSpringCodeGen Available: android
ndroid
aspnet5
async-scala
cwiki
csharp
cpprest
.....
at io.swagger.codegen.CodegenConfigLoader.forName(CodegenConfigLoader.java:31)
at io.swagger.codegen.config.CodegenConfigurator.toClientOptInput(CodegenConfigurator.java:353)
at io.swagger.codegen.cmd.Generate.run(Generate.java:221)
at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:36)
Caused by: java.lang.ClassNotFoundException: com.foo.swag.codegen.swagger.ReadApiSpringCodeGen
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at io.swagger.codegen.CodegenConfigLoader.forName(CodegenConfigLoader.java:29)
... 3 more

Upvotes: 3

Views: 5262

Answers (2)

Sannu
Sannu

Reputation: 1276

I fixed it by extending SpringCodegen class and overriding toApiName() method.

public class ReadApiSpringCodeGen extends SpringCodegen
{
    @Override
    public String toApiName(String name) {
        return "CustomReadApi";
    }
}

Works perfectly. Thanks for all the clues.

Upvotes: 1

ByeBye
ByeBye

Reputation: 6966

You have to override method apiFilename - something like this:

@Override
public String apiFilename(final String templateName, final String tag) {
    final String pathWithFile = super.apiFilename(templateName, tag);
    final String pathWithoutFileExtension = pathWithFile.substring(0, pathWithFile.lastIndexOf('.')); //without .java
    final int index = pathWithoutFileExtension.lastIndexOf('.');
    final String className = ".Read" + pathWithoutFileExtension.substring(index+1) + ".java";
    result pathWithoutFileExtension.substring(0, pathWithoutFileExtension.lastIndexOf('.')) + className;
}

Upvotes: 1

Related Questions