How to use custom templates in Swagger

11,040

Solution 1

You can get the help options for the code generator like such:

java -jar swagger-codegen-cli.jar help generate

Which should tell you that you can override the template location with the -t parameter:

java -java swagger-codegen-cli.jar generate -l {language} -t path/to/templates

Solution 2

Regarding the above ava -java swagger-codegen-cli.jar generate -l {language} -t path/to/templates,

I've managed to make it work with current being-worked-on-release (2.2.0). With 2.1.6 (current GA) it does not work.

I have posted the following on swagger-codegen at GitHub: https://github.com/swagger-api/swagger-codegen/issues/3188

Did not get any attention though...

Share:
11,040
Gobliins
Author by

Gobliins

Updated on June 17, 2022

Comments

  • Gobliins
    Gobliins almost 2 years

    I have this JavaJaxRs dictionary with my templates:

    /templates/JavaJaxRs
    

    I edited some of them. And want to use them for my API generation (Code was inspired from this approach from https://github.com/swagger-api/swagger-codegen/blob/master/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java):

        System.out.println("Generating API for: " + location);
        DefaultGenerator generator = new DefaultGenerator();
        Swagger swagger = new SwaggerParser().read(location);
        CodegenConfig config = CodegenConfigLoader.forName(this.language);
        config.setOutputDir(new File(this.apiGeneratedSrcPath).getPath());
    
        if (null != templateDirectory) {
            config.additionalProperties().put(TEMPLATE_DIR_PARAM, templateDirectory);
        }
        if (null != modelPackage) {
            config.additionalProperties().put(MODEL_PACKAGE_PARAM, modelPackage);
        }
        if (null != apiPackage) {
            config.additionalProperties().put(API_PACKAGE_PARAM, apiPackage);
        }
        if (null != invokerPackage) {
            config.additionalProperties().put(INVOKER_PACKAGE_PARAM, invokerPackage);
        }
    
        if (configOptions != null) {
            for (CliOption langCliOption : config.cliOptions()) {
                if (configOptions.containsKey(langCliOption.getOpt())) {
                    config.additionalProperties().put(langCliOption.getOpt(),
                            configOptions.get(langCliOption.getOpt()));
                }
            }
        }
    
        if (null != configurationFile) {
            Config genConfig = ConfigParser.read(configurationFile);
            if (null != genConfig) {
                for (CliOption langCliOption : config.cliOptions()) {
                    if (genConfig.hasOption(langCliOption.getOpt())) {
                        config.additionalProperties().put(langCliOption.getOpt(), genConfig.getOption(langCliOption.getOpt()));
                    }
                }
            } else {
                throw new RuntimeException("Unable to read configuration file");
            }
        }
    
        ClientOptInput input = new ClientOptInput().opts(new ClientOpts()).swagger(swagger);
        input.setConfig(config);
    
        generator.opts(input).generate();
    

    Somehow i always get the code generated with the standard template file.

    UPDATE:

    When i remember correctly i had a conditional bug on:

    if(null != templateDirectory)
        config.additionalProperties().put(TEMPLATE_DIR_PARAM, templateDirectory);
    

    or somewhere else but with the right condition, code was working as intended.

    I let the question stay here, maybe it will help some other users.