Archetype for generating a spring-boot service based on Spring Boot 2.6.6
Quickly create your project by following the instructions here
Built-in Feature
- Auto Generation Base Code Structure
- Auto Generation Example API
- Auto Generation API Docs
- Internationalization supported
- Prometheus metrics supported
- Auto Mapper supported
- Lombok supported
- Spring Validation supported
- Common Exception Handling
- Logging
Addition feature
- Integration Maria DB
- Integration Mongo DB
- Integration MinIO
- Integration Keycloak Auth
- Integration Kafka
- Integration Elasticsearch
- Integration Kong Gateway
- Redis Caching
- JDK >= 1.8
- Maven >= 3.6.3
- IDE: Eclipse or Intellij IDEA
- Run this script to generate new project from this archetype
mvn archetype:generate -DarchetypeGroupId=com.atviettelsolutions -DarchetypeArtifactId=vts-kit-ms-template
- Enter your project infomation (groupId, artifactId, package,...)
- Build Generated Project.
mvn clean package
# Skip Unittest
mvn clean package -DskipTests
- Import Open API Docs URL into API Testing Tool (Ex: Postman)
http://localhost:8080/<artifactId>/api-docs
- Call Example API
curl --location --request GET 'http://localhost:8080/<artifactId>/book/view/getListBook' --header 'Accept: */*'
local
: Default. Use for Development on local enviromentdocker
: Use for running on Docker or Kubernetes
This Template Generated Code Structure base on MVC Pattern
Example API with CRUD operation auto generated for testing
@RestController
@RequestMapping("/book")
public class BookController extends AbstractRestController {
private BookService bookService;
@PostMapping("/edit/createBook")
public ResponseEntity<Object> createBook(@Valid @RequestBody BookDTO bookInfo) {
return RestUtils.responseOk(bookService.createBook(bookInfo));
}
@GetMapping("/view/getBookDetail/{bookId}")
public ResponseEntity<Object> getBookDetail(@PathVariable("bookId") String bookId) {
BookDTO rsDelete = bookService.getBookDetail(bookId);
if(rsDelete == null){
return RestUtils.response404(InternationalizationUtils.getMessage("msg.error.notFound"));
}
return RestUtils.responseOk(rsDelete);
}
@PostMapping("/edit/updateBook")
public ResponseEntity<Object> updateBook(@Valid @RequestBody UpdateBookDTO bookInfo) {
BookDTO rsUpdate = bookService.updateBook(bookInfo);
if(rsUpdate == null){
return RestUtils.response404(InternationalizationUtils.getMessage("msg.error.notFound"));
}
return RestUtils.responseOk(rsUpdate);
}
@PostMapping("/edit/deleteBook/{bookId}")
public ResponseEntity<Object> deleteBook(@PathVariable("bookId") String bookId) {
BookDTO rsDelete = bookService.deleteBook(bookId);
if(rsDelete == null){
return RestUtils.response404(InternationalizationUtils.getMessage("msg.error.notFound"));
}
return RestUtils.responseOk(rsDelete);
}
@GetMapping("/view/getListBook")
public ResponseEntity<Object> getListBook() {
return RestUtils.responseOk(bookService.getListBook());
}
}
This Template Built-in supported Open API docs base on Swagger OAS
API Docs Auto Generated at URL: http://localhost:8080/<artifactId>/api-docs
By default, This Template built-in supported Internationalization with 2 language: English and Vietnamese.
Language auto resolve by Request Header Accept-Language
- First, define message on
messages_en.properties
andmessages_vi.properties
file.
messages_en.properties
msg.error.notFound=Infomation not found
messages_vi.properties
msg.error.notFound=Không tìm thấy thông tin
- Then, Get message in java code by properties key.
String message = InternationalizationUtils.getMessage("msg.error.notFound")
This Template built-in supported spring-boot-starter-actuator
for monitoring.
Endpoint: http://localhost:8080/<artifactId>/actuator/prometheus
By supported Mapstruct built-in. Mapper binding become easy and quickly
@Mapper(componentModel = "spring")
public interface BookMapper extends IMapper<Book, BookDTO> {
}
With Lombok, Getter or Setter Auto generated
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BookDTO {
private String id;
private String name;
private String author;
}
Use annotation for define validation. Refer Javax Validation Constraints.
Internationalization message built-in supported. Define on validation_en.properties
and validation_vi.properties
validation_en.properties
validation.book.nameNotEmpty=Name must not empty
validation.book.authorNotEmpty=Author must not empty
validation_vi.properties
validation.book.nameNotEmpty=Tên không được rỗng
validation.book.authorNotEmpty=Tác giả không được rỗng
Annotation Usage
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BookDTO {
private String id;
@NotEmpty(message = "{validation.book.nameNotEmpty}")
private String name;
@NotEmpty(message = "{validation.book.authorNotEmpty}")
private String author;
}
All Exception errors are handled centrally at ExceptionHandler
for easy management and maintenance
@ControllerAdvice
public class ExceptionHandler extends AbstractExceptionHandler {
@Override
protected ResponseEntity<ErrorDTO> handleAccessDeniedException() {
return super.handleAccessDeniedException();
}
@Override
protected ResponseEntity<ErrorDTO> handleCommonException(Exception ex) {
return super.handleCommonException(ex);
}
@Override
protected ResponseEntity<ErrorDTO> handleMethodArgumentException(MethodArgumentNotValidException ex) {
return super.handleMethodArgumentException(ex);
}
@Override
protected ResponseEntity<ErrorDTO> handleConstraintViolationException(ConstraintViolationException ex) {
return super.handleConstraintViolationException(ex);
}
@Override
protected ResponseEntity<ErrorDTO> handleMissingPartException(Exception ex) {
return super.handleMissingPartException(ex);
}
}
- IDE: Eclipse, Intellij IDEA
- JDK: >= JDK 8
- Maven: >= 3.6.0
- Build:
# cd archetype directory
cd archetype
# build
mvn clean install -DskipTests
If you have any ideas, just open an issue and tell us what you think.
If you'd like to contribute, please refer Contributors Guide
This code is under the MIT License.
See the LICENSE file for required notices and attributions.