{"id":22473335,"url":"https://github.com/arsy786/springboot-best-practices","last_synced_at":"2025-10-16T11:31:08.582Z","repository":{"id":147956148,"uuid":"571230499","full_name":"arsy786/springboot-best-practices","owner":"arsy786","description":"This repo serves as a guide for Spring Boot best practices!","archived":false,"fork":false,"pushed_at":"2024-03-16T03:27:39.000Z","size":606,"stargazers_count":21,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-06T12:24:12.694Z","etag":null,"topics":["2022","guide","java","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arsy786.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-27T15:28:58.000Z","updated_at":"2024-12-04T15:49:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"1c04a78c-5545-4fac-a8ae-41a34c889a66","html_url":"https://github.com/arsy786/springboot-best-practices","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsy786%2Fspringboot-best-practices","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsy786%2Fspringboot-best-practices/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsy786%2Fspringboot-best-practices/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsy786%2Fspringboot-best-practices/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arsy786","download_url":"https://codeload.github.com/arsy786/springboot-best-practices/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236713492,"owners_count":19193079,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2022","guide","java","spring-boot"],"created_at":"2024-12-06T12:22:29.936Z","updated_at":"2025-10-16T11:31:08.576Z","avatar_url":"https://github.com/arsy786.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Spring Boot Best practices\n\n\u003e ✅ **Part of the [Spring Boot Roadmap](https://github.com/arsy786/spring-boot-roadmap)** — a curated masterclass covering everything from Java basics to advanced Spring Boot projects and practices.\n\nIt is one of several interconnected repositories making up the broader [Spring Boot Roadmap](https://github.com/arsy786/spring-boot-roadmap), which provides a complete learning journey.\n\n---\n\nThis tutorial is derived from: [Spring Boot Best Practices For Developers 👨‍💻 (Youtube/JavaTechie)](https://www.youtube.com/watch?v=NaEk2zAmDE8)\nand [Spring Boot Best Practices for Developers (Medium/RaviYasas)](https://medium.com/@raviyasas/spring-boot-best-practices-for-developers-3f3bdffa0090)\n\nThis is a guide for best practices and includes tips which you can use to improve your Spring Boot application and make it more efficient.\n\n## Table of Contents\n\n[Getting Started](#getting-started)\n\u003cbr\u003e\n[0. Notable Mentions](#0-notable-mentions)\n\u003cbr\u003e\n[1. Proper packaging style](#1-proper-packaging-style)\n\u003cbr\u003e\n[2. Use Spring Boot starters](#2-use-spring-boot-starters)\n\u003cbr\u003e\n[3. Use proper versions of the dependencies](#3-use-proper-versions-of-the-dependencies)\n\u003cbr\u003e\n[4. Use Lombok](#4-use-lombok)\n\u003cbr\u003e\n[5. Use Controllers only for routing](#5-use-controllers-only-for-routing)\n\u003cbr\u003e\n[6. Use Services for business logic](#6-use-services-for-business-logic)\n\u003cbr\u003e\n[7. Use constructor injection with Lombok](#7-use-constructor-injection-with-lombok)\n\u003cbr\u003e\n[8. Use Slf4j logging](#8-use-slf4j-logging)\n\u003cbr\u003e\n[9. Use meaningful words for classes, methods, variables and other attributes](#9-use-meaningful-words-for-classes-methods-variables-and-other-attributes)\n\u003cbr\u003e\n[10. Bean Validation](#10-bean-validation)\n\u003cbr\u003e\n[11. Custom Exception Handling](#11-custom-exception-handling)\n\u003cbr\u003e\n[12. Use custom response object](#12-use-custom-response-object)\n\u003cbr\u003e\n[13. Use design patterns](#13-use-design-patterns)\n\u003cbr\u003e\n[14. Use yml instead of properties](#14-use-yml-instead-of-properties)\n\u003cbr\u003e\n[15. Encrypt or externalize sensitive info](#15-encrypt-or-externalize-sensitive-info)\n\u003cbr\u003e\n[16. Write E2E Unit Test cases with coverage](#16-write-e2e-unit-test-cases-with-coverage)\n\u003cbr\u003e\n[17. Avoid NPE by using Optional](#17-avoid-npe-by-using-optional)\n\u003cbr\u003e\n[18. Use best practices for the collection framework](#18-use-best-practices-for-the-collection-framework)\n\u003cbr\u003e\n[19. Use Caching](#19-use-caching)\n\u003cbr\u003e\n[20. Use Pagination](#20-use-pagination)\n\u003cbr\u003e\n[21. Remove unnecessary codes, variables, methods](#21-remove-unnecessary-codes-variables-methods)\n\u003cbr\u003e\n[22. Use Comments](#22-use-comments)\n\u003cbr\u003e\n[23. Use a common code formatting style](#23-use-a-common-code-formatting-style)\n\u003cbr\u003e\n[24. Use SonarLint](#24-use-sonarlint)\n\u003cbr\u003e\n[25. Be Simple!](#25-be-simple)\n\u003cbr\u003e\n\n## Getting Started\n\n### Prerequisites\n\n- Git\n- Java 8\n- Maven\n\n### Running the App\n\n1.  Open your terminal or command prompt.\n\n2.  Clone the repository using Git:\n\n    ```bash\n    git clone https://github.com/arsy786/springboot-best-practices.git\n    ```\n\n3.  Navigate to the cloned repository's root directory:\n\n    ```bash\n    cd springboot-best-practices\n    ```\n\n4.  Run the following Maven command to build and start the service:\n\n    ```bash\n    # For Maven\n    mvn spring-boot:run\n\n    # For Maven Wrapper (automatically uses the correct Maven version)\n    ./mvnw spring-boot:run\n    ```\n\nThe application should now be running on `localhost:9191`.\n\n### Database Configuration\n\nConfigure your MySQL database connection by editing the `application.yml` in `src/main/resources`:\n\n```yml\n#DataSource Configuration\nspring:\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql://localhost:3306/javatechie\n    username: root\n    password: root\n```\n\n- Replace the `url` with your database's JDBC URL.\n- Update `username` and `password` as needed.\n\n**NOTE:** To use a different SQL database, include the appropriate database driver in your `pom.xml` and update the `application.yml` config accordingly.\n\n## 0. Notable Mentions\n\n1. Create application.yml for each environment. For example: application-dev.yml, application-prod.yml ...\n2. Use a library to map DTOs, such as MapStruct.\n3. Use soft delete.\n4. Use environment variables to avoid hard-coding.\n\n## 1. Proper packaging style\n\n- You can structure your application with meaningful packaging.\n- Proper packaging will help to understand the code and the flow of the application easily.\n- You can include all your controllers into a separate package, services in a separate package, util classes into a separate package…etc. This style is very convenient in small-size microservices.\n- If you are working on a huge code base, a feature-based approach can be used.\n- You can decide which to adopt, depending on your requirements.\n\nBased on type:\n\n![type-based-packaging](type-based-packaging.webp)\n\nBased on feature:\n\n![feature-based-packaging](feature-based-packaging.webp)\n\n## 2. Use Spring Boot starters\n\n- We can very easily use starter dependencies without adding single dependencies one by one. These starter dependencies are already bundled with the required dependencies.\n- Can add these easily using Spring Initializr.\n- For example, if we add spring-boot-starter-web dependency, by default it is bundled with jackson, spring-core, spring-mvc, and spring-boot-starter-tomcat dependencies.\n- As a result, we don’t need to care about adding dependencies separately.\n- Also, it helps us to avoid version mismatches.\n\n## 3. Use proper versions of the dependencies\n\n- It is always recommended to use the latest stable GA (General Availability) versions.\n- Sometimes it may vary with the Java version, server versions, the type of the application, etc.\n- Do not use different versions of the same package and always use `\u003cproperties\u003e` to specify the version if there are multiple dependencies. For example:\n\n![dependency-versions](dependency-versions.webp)\n\n- Spring boot starters will have their versions defined by the Parent version, and this will automatically configure all the external libraries to be operating on the same versions!\n  For example:\n\n![dependency-versions-sb-parent](dependency-versions-sb-parent.png)\n\n## 4. Use Lombok\n\n- Lombok is a Java library that is used to reduce boilerplate code and allow you to write clean code using its annotations.\n- For example, you may use plenty of lines for getters and setters in some classes like entities, request/response objects, dtos…etc.\n- But if you use Lombok, it is just one line, you can use @Data, @Getter or @Setter as per your requirement.\n- You can use Lombok logger annotations as well. @Slf4j is recommended.\n\n## 5. Use Controllers only for routing\n\n- Controllers are dedicated to routing.\n- It is stateless and singleton.\n- The DispatcherServlet will check the @RequestMapping on Controllers.\n- Controllers are the ultimate target of requests, then requests will be handed over to the service layer and processed by the service layer.\n- The business logic should not be in the controllers.\n\n_For code implementation example(s) check:_\n[ProductController.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/java/com/javatechie/controller/ProductController.java)\nor\n[TeamController.java](https://github.com/arsy786/football-club-management-system/blob/master/src/main/java/dev/arsalaan/footballclubmanagementsystem/controller/TeamController.java)\n\n## 6. Use Services for business logic\n\n- The complete business logic goes here with validations, caching…etc.\n- Services communicate with the persistence layer and receive the results.\n- Services are also singleton.\n\n_For code implementation example(s) check:_\n[ProductService.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/java/com/javatechie/service/ProductService.java)\nor\n[TeamService.java](https://github.com/arsy786/football-club-management-system/blob/master/src/main/java/dev/arsalaan/footballclubmanagementsystem/service/TeamService.java)\n\n## 7. Use constructor injection with Lombok\n\n- When we talk about dependency injection, there are two types.\n- One is “constructor injection” and the other is “setter injection”. Apart from that, you can also use “field injection” using the very popular @Autowired annotation.\n- But we highly recommend using Constructor injection over other types. Because it allows the application to initialize all required dependencies at the initialization time.\n- This is very useful for unit testing.\n- The important thing is, that we can use the @RequiredArgsConstructor annotation by Lombok to use constructor injection.\n\n_For code implementation example(s) check:_\n[ProductController.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/java/com/javatechie/controller/ProductController.java)\nor\n[ProductService.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/java/com/javatechie/service/ProductService.java)\n\n## 8. Use Slf4j logging\n\n- Logging is very important.\n- If a problem occurs while your application is in production, logging is the only way to find out the root cause.\n- Therefore, you should think carefully before adding loggers, log message types, logger levels, and logger messages.\n- Do not use System.out.print()\n- Slf4j is recommended to use along with logback which is the default logging framework in Spring Boot.\n- Always use slf4j { } and avoid using String interpolation in logger messages. Because string interpolation consumes more memory.\n- You can use Lombok @Slf4j annotation to create a logger very easily.\n- If you are in a micro-services environment, you can use the ELK stack.\n\n_For code implementation example(s) check:_\n[ProductController.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/java/com/javatechie/controller/ProductController.java)\nand\n[ProductService.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/java/com/javatechie/service/ProductService.java)\nor\n[TeamController.java](https://github.com/arsy786/football-club-management-system/blob/master/src/main/java/dev/arsalaan/footballclubmanagementsystem/controller/TeamController.java)\nand\n[TeamService.java](https://github.com/arsy786/football-club-management-system/blob/master/src/main/java/dev/arsalaan/footballclubmanagementsystem/service/TeamService.java)\nand\n[ApiExceptionHandler.java](https://github.com/arsy786/football-club-management-system/blob/master/src/main/java/dev/arsalaan/footballclubmanagementsystem/exception/ApiExceptionHandler.java)\n\n## 9. Use meaningful words for classes, methods, variables and other attributes\n\n- Always use proper meaningful and searchable naming conventions with proper case.\n- Usually, we use nouns or short phrases when declaring classes, variables, and constants. For example: String firstName, const isValid\n- You can use verbs and short phrases with adjectives for functions and methods. For example: readFile(), sendData()\n- Avoid using abbreviating variable names and intention revealing names. For example: int i; String getExUsr;\n- If you use this meaningfully, declaration comment lines can be reduced. Since it has meaningful names, a fresh developer can easily understand by reading the code.\n\n![cases](cases.webp)\n\n- There are many different case styles we can adopt, as shown above.\n- But, we must identify which case is dedicated to which variable and be consistent with it. Most common standard:\n\nClasses = PascalCase\n\u003cbr\u003e\nMethods \u0026 Variables = camelCase\n\u003cbr\u003e\nConstants = SCREAMING_SNAKE_CASE\n\u003cbr\u003e\nDB-related fields = snake_case\n\n## 10. Bean Validation\n\n- Apply to DTOs.\n- Use annotations such as @NotBlank, @Min, @Max, and add messages to each.\n- Use @Valid in Controller POST request method attributes to validate against the DTO bean validation annotations.\n\nNOTE: Use the annotations from javax.persistence._ for adding constraints in the Model/Entity layer.\n\u003cbr\u003e\nNOTE: Use the annotations from javax.validation.constraints._ for adding validation in the DTO layer.\n\n_For code implementation example(s) check:_\n[Team.java](https://github.com/arsy786/football-club-management-system/blob/master/src/main/java/dev/arsalaan/footballclubmanagementsystem/model/Team.java)\nand\n[TeamDTO.java](https://github.com/arsy786/football-club-management-system/blob/master/src/main/java/dev/arsalaan/footballclubmanagementsystem/dto/TeamDTO.java)\nor\n[ProductRequestDTO.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/java/com/javatechie/dto/ProductRequestDTO.java)\n\n## 11. Custom Exception Handling\n\n- This is very important when working with large enterprise-level applications.\n- Apart from the general exceptions, we may have some scenarios to identify some specific error cases.\n- Exception adviser can be created with @ControllerAdvice, and we can create separate exceptions with meaningful details.\n- It will make it much easier to identify and debug errors in the future.\n\n_For code implementation example(s) check:_\n[FCMS Exception Folder](https://github.com/arsy786/football-club-management-system/tree/master/src/main/java/dev/arsalaan/footballclubmanagementsystem/exception)\nor\n[This Exception Folder](https://github.com/arsy786/springboot-best-practices/tree/master/src/main/java/com/javatechie/handler) with\n[This Handler Folder](https://github.com/arsy786/springboot-best-practices/tree/master/src/main/java/com/javatechie/exception)\nor\n[Different Project Exception Folder](https://github.com/raviyasas/springboot-exceptions-demo/tree/master/src/main/java/com/app/exception)\n\n## 12. Use custom response object\n\n- A custom response object can be used to return an object with some specific data with the requirements like HTTP status code, API code, message, etc.\n\n_For code implementation example(s) check:_\n[APIResponse.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/java/com/javatechie/dto/APIResponse.java)\n\n## 13. Use design patterns\n\n- Know **when** and **where** to use _which_ pattern.\n- Builder and Singleton most used in Spring Boot applications.\n\n\u003cins\u003eSupporting Material\n\n[Using Lombok’s @Builder Annotation (Baeldung/EricGoebelbecker)](https://www.baeldung.com/lombok-builder)\n\u003cbr\u003e\n[Design Patterns in the Spring Framework (Baeldung/JustinAlbano)](https://www.baeldung.com/spring-framework-design-patterns)\n\u003cbr\u003e\n\n## 14. Use yml instead of properties\n\n- Less repetition/duplication of the key prefix.\n- More readable.\n- Also, use comments in config file to separate which settings belong to which feature.\n\n_For code implementation example(s) check:_\n[application.yml](https://github.com/arsy786/springboot-best-practices/blob/master/src/main/resources/application.yml)\n\n## 15. Encrypt or externalize sensitive info\n\n- Encrypt ALL passwords (never store as plain text).\n- Move this information outside the codebase (Vault, git server, cloud config, etc.)\n\n\u003cins\u003eSupporting Material\n\n[Bcrypt Password Encryption with Spring Boot (Youtube/ProgrammingWithBasar)](https://www.youtube.com/watch?v=_RaVRqfpjZo)\n\u003cbr\u003e\n\n## 16. Write E2E Unit Test cases with coverage\n\n- This is done to validate that all features and API's are working as expected.\n- Why do we mock Repository/Service? We do not want the test data to save to the DB, so mocking the behaviour of methods helps us bypass DB interactions.\n- Test ALL endpoints/methods.\n- Test positive AND negative scenarios for each endpoint. Include Edge Cases!\n- Running the code with Coverage allows us to identify which parts of the code have or have not been tested.\n- Aim for 100% coverage!\n\n_For code implementation example(s) check:_\n[All FCMS Tests](https://github.com/arsy786/football-club-management-system/tree/master/src/test/java/dev/arsalaan/footballclubmanagementsystem)\nor\n[TeamMockMvcIT.java](https://github.com/arsy786/football-club-management-system/blob/master/src/test/java/dev/arsalaan/footballclubmanagementsystem/TeamMockMvcIT.java)\nor\n[ProductServiceApplicationTests.java](https://github.com/arsy786/springboot-best-practices/blob/master/src/test/java/com/javatechie/ProductServiceApplicationTests.java)\n\n## 17. Avoid NPE by using Optional\n\n- In Java 8, to avoid NullPointerException you can use Optional\u003cT\u003e from java.util.package.\n- Can use:\n\n```java\nOptional.ofNullable(object);\n\n// or\n\nproductRepository.findById(productId).orElseThrow(\n() -\u003e new ProductNotFoundException(\"product not found with id: \" + productId))\n```\n\n## 18. Use best practices for the collection framework\n\n- Use appropriate collection (data structure) for your data set.\n- Use forEach with Java 8 features and avoid using legacy for loops.\n- pre- and post-Java 8 comparison:\n\n```java\n// pre-Java 8\nMap\u003cString, List\u003cProductResponseDTO\u003e\u003e productsMap = new HashMap\u003c\u003e();\n        List\u003cString\u003e productTypes = Arrays.asList(\"Electronics\", \"fashion\", \"Kitchen\");//1st iteration from DB\n\n        List\u003cProduct\u003e productList = productRepository.findAll(); //2nd\n\n        for (String type : productTypes) {\n            List\u003cProductResponseDTO\u003e productResponseDTOList = new ArrayList\u003c\u003e();\n            for (Product product : productList) {\n                if (type.equals(product.getProductType())) {\n                    productResponseDTOList.add(ValueMapper.convertToDTO(product));\n                }\n                productsMap.put(type, productResponseDTOList);\n            }\n        }\n\n        return productsMap;\n\n// post-Java 8\nMap\u003cString, List\u003cProductResponseDTO\u003e\u003e productsMap = productRepository.findAll().stream()\n                            .map(ValueMapper::convertToDTO)\n                            .filter(productResponseDTO -\u003e productResponseDTO.getProductType() != null)\n                            .collect(Collectors.groupingBy(ProductResponseDTO::getProductType));\nreturn productsMap;\n```\n\n- Functional programming is better for performance and readability.\n- Use interface type instead of the implementation.\n- Use isEmpty() over size() for better readability.\n- Do not return null values, you can return an empty collection.\n\n## 19. Use Caching\n\n- Caching is another important factor when talking about application performance.\n- It reduces the round trip of your request from your application to the DB (if no changes were detected).\n- By default, Spring Boot provides caching with ConcurrentHashMap and you can achieve this by @EnableCaching annotation.\n- If you are not satisfied with default caching, you can use Redis, Hazelcast, or any other distributed caching implementations.\n- Redis and Hazelcast are in-memory caching methods. You also can use database cache implementations as well.\n\n\u003cins\u003eSupporting Material\n\n[Spring Data Redis as Cache (Youtube/JavaTechie)](https://www.youtube.com/watch?v=vpe4aDu5ixI)\n\u003cbr\u003e\n[Spring Boot Caching With Real Life Example (Youtube/GreenLearner)](https://www.youtube.com/watch?v=Yf-zH5Q9FQM)\n\u003cbr\u003e\n\n## 20. Use Pagination\n\n- This is useful if you have lots of records, it allows us to view the data more easily.\n- This will improve the performance of the application.\n- If you’re using Spring Data JPA, the PagingAndSortingRepository makes using pagination very easy and with little effort.\n\n\u003cins\u003eSupporting Material\n\n[Pagination and Sorting With Spring Data JPA (Youtube/JavaTechie)](https://www.youtube.com/watch?v=Wa0GQwWwzJE)\n\u003cbr\u003e\n[Spring Data JPA Pagination (Youtube/DanVega)](https://www.youtube.com/watch?v=oq-c3D67WqM)\n\n## 21. Remove unnecessary codes, variables, methods\n\n- Unused variable declarations will acquire some memory.\n- Remove unused methods, classes, imports, vars etc. because it will impact the performance of the application.\n- Try to avoid nested loops. You can use Java 8 Streams instead.\n\n\u003cins\u003eSupporting Material\n\n[Functional Programming with Java Streams API (Youtube/Amigoscode)](https://www.youtube.com/watch?v=f5j1TaJlc0w)\n\n## 22. Use Comments\n\n- Commenting is a good practice unless you abuse it.\n- DO NOT comment on everything. Instead, you can write descriptive code using meaningful words for classes, functions, methods, variables…etc.\n- Remove commented codes, misleading comments, and story-type comments.\n- You can use comments for warnings and explain something difficult to understand at first sight.\n- Example of comment explaining a method:\n\n```java\n/** this method will fetch product from DB by ID\n* @param productId\n* @return product response from DB\n*/\n```\n\n## 23. Use a common code formatting style\n\n- Have a consistent and uniform way of formatting your code.\n- Use spaces and/or returns in an ordered and readable manner.\n- CMD+OPTION+L on highlighted code in IDE for code reformatting!\n- Can see below, two different ways of formatting the same code. To avoid discrepancies, you or your team should have a common coding format.\n\n![code-formatting](code-formatting.webp)\n\n## 24. Use SonarLint\n\n- This is very useful for identifying small bugs and best practices to avoid unnecessary bugs and code quality issues.\n- You can install the plugin into your favorite IDE.\n\n## 25. Be Simple!\n\n- Always try to write readable, understandable and simple code!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farsy786%2Fspringboot-best-practices","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farsy786%2Fspringboot-best-practices","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farsy786%2Fspringboot-best-practices/lists"}