Giter VIP home page Giter VIP logo

generator-springboot's Introduction

generator-springboot

The Yeoman generator for generating Spring Boot microservices.

Prerequisites

  • Node 18+
  • JDK 17+

Installation

$ npm install -g yo
$ npm install -g generator-springboot

How to use?

Run the following command and answer the questions:

$ yo springboot

Features

The generator-springboot generates a Spring Boot application with the following features configured:

  • Spring Boot project with Maven and Gradle support
  • Spring Data JPA integration with an option to select databases like MySQL, Postgresql, MariaDB.
  • Flyway and Liquibase database migration support.
  • Spring Cloud AWS support with LocalStack configuration.
  • CORS configuration
  • Swagger UI Integration
  • SpringBoot Actuator configuration
  • Testcontainers based Testing and Local dev mode setup
  • DockerCompose configuration for application, ELK, Prometheus, Grafana
  • GitHub Actions Configuration
  • Dockerfile
  • Jenkinsfile
  • SonarQube and JaCoCo based static analysis tools configuration
  • Code formatting using Spotless and google-java-format
  • JUnit 5

Generate a SpringBoot Microservice

After installing the generator-springboot, you can generate a new Spring Boot application as follows:

$ yo springboot
Generating SpringBoot Application
? What is the application name? blog
? What is the default package name? com.sivalabs.blog
? Which type of database you want to use? Postgresql
? Which type of database migration tool you want to use? FlywayDB
? Select the features you want? ELK Docker configuration, Prometheus, Grafana Docker configuration, Localstack Docker configuration
? Which build tool do you want to use? Maven
    force blog/.yo-rc.json
   create blog/mvnw
   create blog/mvnw.cmd
   create blog/.gitignore
   create blog/.mvn/wrapper/maven-wrapper.jar
   create blog/.mvn/wrapper/maven-wrapper.properties
   create blog/pom.xml
   create blog/Dockerfile
   create blog/Jenkinsfile
   create blog/lombok.config
   create blog/sonar-project.properties
   create blog/README.md
   create blog/.github/workflows/maven.yml
   create blog/src/main/resources/db/migration/postgresql/V1__01_init.sql
   create blog/docker/docker-compose.yml
   create blog/docker/docker-compose-app.yml
   create blog/docker/docker-compose-monitoring.yml
   create blog/config/prometheus/prometheus.yml
   create blog/config/grafana/provisioning/dashboards/basic-dashboard.json
   create blog/config/grafana/provisioning/dashboards/dashboard.yml
   create blog/config/grafana/provisioning/dashboards/jvm-micrometer_rev10.json
   create blog/config/grafana/provisioning/datasources/datasource.yml
   create blog/docker/docker-compose-elk.yml
   create blog/config/elk/logstash.conf
   create blog/.localstack/01_init.sh
   create blog/src/main/java/com/sivalabs/blog/Application.java
   create blog/src/main/java/com/sivalabs/blog/config/WebMvcConfig.java
   create blog/src/main/java/com/sivalabs/blog/config/SwaggerConfig.java
   create blog/src/main/java/com/sivalabs/blog/config/ApplicationProperties.java
   create blog/src/main/java/com/sivalabs/blog/config/Initializer.java
   create blog/src/main/java/com/sivalabs/blog/config/GlobalExceptionHandler.java
   create blog/src/main/java/com/sivalabs/blog/config/logging/Loggable.java
   create blog/src/main/java/com/sivalabs/blog/config/logging/LoggingAspect.java
   create blog/src/main/java/com/sivalabs/blog/exception/ResourceNotFoundException.java
   create blog/src/main/java/com/sivalabs/blog/model/response/PagedResult.java
   create blog/src/main/java/com/sivalabs/blog/utils/AppConstants.java
   create blog/src/main/resources/application.properties
   create blog/src/main/resources/application-local.properties
   create blog/src/main/resources/logback-spring.xml
   create blog/src/test/java/com/sivalabs/blog/ApplicationIntegrationTest.java
   create blog/src/test/java/com/sivalabs/blog/SchemaValidationTest.java
   create blog/src/test/java/com/sivalabs/blog/common/ContainersConfig.java
   create blog/src/test/java/com/sivalabs/blog/common/AbstractIntegrationTest.java
   create blog/src/test/java/com/sivalabs/blog/TestApplication.java
   create blog/src/test/java/com/sivalabs/blog/SqsListenerIntegrationTest.java
   create blog/src/test/resources/application-test.properties
   create blog/src/test/resources/logback-test.xml

No change to package.json was detected. No package manager install will be executed.
Picked up JAVA_TOOL_OPTIONS:  -Xmx3489m
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< com.sivalabs.blog:blog >-----------------------
[INFO] Building blog 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- spotless:2.39.0:apply (default-cli) @ blog ---
[INFO] Index file does not exist. Fallback to an empty index
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/config/SwaggerConfig.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/config/GlobalExceptionHandler.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/config/logging/LoggingAspect.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/exception/ResourceNotFoundException.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/model/response/PagedResult.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/test/java/com/sivalabs/blog/common/ContainersConfig.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/test/java/com/sivalabs/blog/common/AbstractIntegrationTest.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/test/java/com/sivalabs/blog/SchemaValidationTest.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/test/java/com/sivalabs/blog/TestApplication.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/test/java/com/sivalabs/blog/SqsListenerIntegrationTest.java
[INFO] Spotless.Java is keeping 17 files clean - 10 were changed to be clean, 7 were already clean, 0 were skipped because caching determined they were already clean
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.454 s
[INFO] Finished at: 2023-10-25T16:57:22Z
[INFO] ------------------------------------------------------------------------
==========================================
Your application is generated successfully
  cd blog
  > ./mvnw spring-boot:run
==========================================

Generate REST API with CRUD operations

You can generate REST API with CRUD operation using the following command:

IMPORTANT: You should run the following command from within the generated project folder.

$ cd blog
$ yo springboot:controller Customer --base-path /api/customers

This sub-generator will generate the following:

  • JPA entity
  • Spring Data JPA Repository
  • Service
  • Spring MVC REST Controller with CRUD operations
  • Unit and Integration Tests for REST Controller
  • Flyway or Liquibase migration to create table
$ yo springboot:controller Customer --base-path /api/customers
Generating JPA entity, repository, service and controller
EntityName: Customer, basePath: /api/customers
    force .yo-rc.json
   create src/main/java/com/sivalabs/blog/entities/Customer.java
   create src/main/java/com/sivalabs/blog/exception/CustomerNotFoundException.java
   create src/main/java/com/sivalabs/blog/mapper/CustomerMapper.java
   create src/main/java/com/sivalabs/blog/model/query/FindCustomersQuery.java
   create src/main/java/com/sivalabs/blog/model/request/CustomerRequest.java
   create src/main/java/com/sivalabs/blog/model/response/CustomerResponse.java
   create src/main/java/com/sivalabs/blog/repositories/CustomerRepository.java
   create src/main/java/com/sivalabs/blog/services/CustomerService.java
   create src/main/java/com/sivalabs/blog/web/controllers/CustomerController.java
   create src/test/java/com/sivalabs/blog/web/controllers/CustomerControllerTest.java
   create src/test/java/com/sivalabs/blog/web/controllers/CustomerControllerIT.java
   create src/test/java/com/sivalabs/blog/services/CustomerServiceTest.java
   create src/main/resources/db/migration/postgresql/V2__create_customers_table.sql

No change to package.json was detected. No package manager install will be executed.
Picked up JAVA_TOOL_OPTIONS:  -Xmx3489m
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< com.sivalabs.blog:blog >-----------------------
[INFO] Building blog 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- spotless:2.39.0:apply (default-cli) @ blog ---
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/exception/CustomerNotFoundException.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/model/query/FindCustomersQuery.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/model/request/CustomerRequest.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/entities/Customer.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/mapper/CustomerMapper.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/services/CustomerService.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/main/java/com/sivalabs/blog/web/controllers/CustomerController.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/test/java/com/sivalabs/blog/web/controllers/CustomerControllerIT.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/test/java/com/sivalabs/blog/web/controllers/CustomerControllerTest.java
[INFO] Writing clean file: /workspace/generator-springboot/blog/src/test/java/com/sivalabs/blog/services/CustomerServiceTest.java
[INFO] Spotless.Java is keeping 28 files clean - 10 were changed to be clean, 1 were already clean, 17 were skipped because caching determined they were already clean
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.246 s
[INFO] Finished at: 2023-10-25T16:59:48Z
[INFO] ------------------------------------------------------------------------

Local Development Setup

$ git clone https://github.com/sivaprasadreddy/generator-springboot.git
$ cd generator-springboot
$ npm install -g yo
$ npm install 
$ npm link
$ yo springboot

Releasing a new version

Before publishing a new release, make sure to update the version number in package.json updated.

$ npm login
$ npm publish

License

The generator-springboot is an Open Source software released under the MIT Licence

generator-springboot's People

Contributors

mend-bolt-for-github[bot] avatar rajadilipkolli avatar renovate[bot] avatar sivaprasadreddy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

generator-springboot's Issues

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Rate-Limited

These updates are currently rate-limited. Click on a checkbox below to force their creation now.

  • chore(deps): update eclipse-temurin docker tag to v17.0.11_9-jre-focal
  • chore(deps): update dependency maven-wrapper to v3.3.1
  • chore(deps): update docker.elastic.co/elasticsearch/elasticsearch docker tag to v8.13.3
  • chore(deps): update docker.elastic.co/kibana/kibana docker tag to v8.13.3
  • chore(deps): update docker.elastic.co/logstash/logstash docker tag to v8.13.3
  • ๐Ÿ” Create all rate-limited PRs at once ๐Ÿ”

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

docker-compose
generators/server/templates/app/docker/docker-compose-elk.yml
  • docker.elastic.co/elasticsearch/elasticsearch 8.12.2
  • docker.elastic.co/logstash/logstash 8.12.2
  • docker.elastic.co/kibana/kibana 8.12.2
generators/server/templates/app/docker/docker-compose-monitoring.yml
  • grafana/grafana 10.2.3
  • prom/prometheus v2.49.1
dockerfile
.gitpod.Dockerfile
generators/server/templates/app/Dockerfile
  • eclipse-temurin 17.0.10_7-jre-focal
  • eclipse-temurin 17.0.10_7-jre-focal
github-actions
.github/workflows/build.yml
  • actions/checkout v4
  • actions/setup-node v4
.github/workflows/docs.yml
  • actions/checkout v4
  • actions/setup-python v4
generators/server/templates/app/.github/workflows/gradle.yml
  • actions/checkout v4
  • actions/setup-java v3
generators/server/templates/app/.github/workflows/maven.yml
  • actions/checkout v4
  • actions/setup-java v3
gradle
generators/server/templates/gradle/gradle.properties
generators/server/templates/gradle/code-quality.gradle
generators/server/templates/gradle/owasp.gradle
generators/server/templates/gradle/settings.gradle
generators/server/templates/gradle/build.gradle
gradle-wrapper
generators/common/files/gradle/gradle/wrapper/gradle-wrapper.properties
  • gradle 8.7
maven-wrapper
generators/common/files/maven/.mvn/wrapper/maven-wrapper.properties
  • maven 3.9.6
  • maven-wrapper 3.2.0
npm
package.json
  • chalk 4.1.2
  • lodash 4.17.21
  • shelljs 0.8.5
  • yeoman-environment 3.19.3
  • yeoman-generator 5.10.0
  • chai 4.4.1
  • fs-extra 11.2.0
  • mocha 10.3.0
  • sinon 17.0.1
  • yeoman-assert 3.1.1
  • yeoman-test 6.3.0

  • Check this box to trigger a request for Renovate to run again on this repository

Creating Controller with Custom name is not importing packages correctly

I have tried to create Controller with name Order, it has created class files correctly but the import statements in controller and service class are wrong and pointing to customer package.

Expectation : import statements of entities, Service and Respository in controller should be pointing to correct path.

Confusion with pageNumber on Pagination

Affected Branch : 0.1.1

Glad that we now have pagination for entities, but I think the setting the page number on response will lead to confusion as the page number get increment on response.

This may lead to confusion as the we make the request for the first page, with index 0 and is returned the pageNumber 1. this is quite evident in the controller test where we make requires for 0th page and get returned the page with pageNumber 1,

given(<%= entityVarName %>Service.findAll<%= entityName %>s(0, 10, "id", "asc"))
.willReturn(<%= entityVarName %>PagedResult);
this.mockMvc
.perform(get("<%= basePath %>"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data.size()", is(<%= entityVarName %>List.size())))
.andExpect(jsonPath("$.totalElements", is(3)))
.andExpect(jsonPath("$.pageNumber", is(1)))

Can we have a look into this?

Code Clean up for 0.1.3 version

Considering the new features introduced in Spring Boot 3.1.0, I have the following things that can clean up our code generation process:

  1. Do we need Spring Cloud BOM Configuration?
  2. Remove milestone and snapshot reposiotry configurations
  3. Do we need .editorconfig?
  4. Rename ErrorDetailProblemHandlingControllerAdvice to GlobalExceptionHandler and move into com.mycompany.<service>.config package.
  5. Shall we remove application-heroku.properties, application-local.properties?
  6. Shall we remove generating h2 db migration scripts by default and provide H2 as one of the database option?
  7. When using MySQL database tests are failing with SSL errors.

Add License

You have done cool work.

I would like to fork your project and use that inside our company, but I can not due to missing license.

Github says missing license does not allow me to use your code as a base.

If you willing to let me use the code, add license using this guide.
I'd do it for you, but I have no clue what type of license you would like to have. :)
Thank you!

Run google-java-format after project generation

Formatting the templates as per google java format manually is a painful process especially when rendering something conditionally. So, a better approach could be running google java format goal after project code generation depending on selected build tool.

Cannot run command as root user

Installed all the prerequisites and when I try to create a new project using yo springboot command, I get an error

# yo springboot
/usr/lib/node_modules/yo/node_modules/conf/index.js:128
			throw err;
			^

Error: EACCES: permission denied, open '/root/.config/insight-nodejs/insight-yo.json'
    at Object.openSync (fs.js:440:3)
    at Object.readFileSync (fs.js:342:35)
    at Conf.get store [as store] (/usr/lib/node_modules/yo/node_modules/conf/index.js:108:18)
    at Conf.get (/usr/lib/node_modules/yo/node_modules/conf/index.js:47:27)
    at Insight.get optOut [as optOut] (/usr/lib/node_modules/yo/node_modules/insight/lib/index.js:52:22)
    at Object.<anonymous> (/usr/lib/node_modules/yo/lib/cli.js:205:48)
    at Module._compile (internal/modules/cjs/loader.js:971:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1011:10)
    at Module.load (internal/modules/cjs/loader.js:822:32)
    at Function.Module._load (internal/modules/cjs/loader.js:730:14) {
  errno: -13,
  syscall: 'open',
  code: 'EACCES',
  path: '/root/.config/insight-nodejs/insight-yo.json'
}

Changed the permission to 777 for the file

# chmod 777 /root/.config/insight-nodejs/insight-yo.json
# ls -l /root/.config/insight-nodejs/insight-yo.json
-rwxrwxrwx 1 root root 29 Feb 17 13:29 /root/.config/insight-nodejs/insight-yo.json
# cat /root/.config/insight-nodejs/insight-yo.json
{
	"clientId": 729298861707
}

Cant even run as sudo

# sudo yo springboot
/usr/lib/node_modules/yo/node_modules/conf/index.js:128
			throw err;
			^

Error: EACCES: permission denied, open '/root/.config/insight-nodejs/insight-yo.json'
    at Object.openSync (fs.js:440:3)
    at Object.readFileSync (fs.js:342:35)
    at Conf.get store [as store] (/usr/lib/node_modules/yo/node_modules/conf/index.js:108:18)
    at Conf.get (/usr/lib/node_modules/yo/node_modules/conf/index.js:47:27)
    at Insight.get optOut [as optOut] (/usr/lib/node_modules/yo/node_modules/insight/lib/index.js:52:22)
    at Object.<anonymous> (/usr/lib/node_modules/yo/lib/cli.js:205:48)
    at Module._compile (internal/modules/cjs/loader.js:971:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1011:10)
    at Module.load (internal/modules/cjs/loader.js:822:32)
    at Function.Module._load (internal/modules/cjs/loader.js:730:14) {
  errno: -13,
  syscall: 'open',
  code: 'EACCES',
  path: '/root/.config/insight-nodejs/insight-yo.json'
}

DTO

Do you intend to include the generation of DTO's?

Action Required: Fix Renovate Configuration

There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.

Location: renovate.json
Error type: Invalid JSON (parsing failed)
Message: Syntax error: expecting end of expression or separator near "labe

Improper db table names when using CamelCase variable name

When creating entities with CamelCase scheme, the @Table entity is created with an improper naming scheme.
For eg. when issuing
yo springboot:controller ShoppingCart --base-path /api/shoppingcart , then entity class has @Table(name = "shopping carts") which causes an InvalidDataAccessResourceUsageException when running the tests

Local changes to Yeoman Generator

I have used your generator as a base and have made some customization to address to organizational needs. I tested it locally using npm link and it worked as expected.
Committed the changes in my github repo. Now post taking the pull from git and running it i don't see my changes reflecting.
Please help!!

Enable Github's Discussion

Enabling Github's Discussion will help to chat to the owner of repository , instead of raising Issues for all.

V1.16.0

  • Use fluent JPA setters
  • Moving FindQuery to pojo mapper in service package to util, for re-use purpose
  • provide various mappers(mapstruct/modelmapper,etc) in the lines of liquibase or flyway
  • use loggable annotation in service layer

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.