1. Build Empty Spring Boot Application
Create a new Spring Boot project using Spring Initializr or your preferred IDE.
Include the following dependencies:
- Spring Web
- Spring Data JPA
- Spring Boot DevTools (Optional for development)
- H2 Database (for simplicity in this example)
- Spring Boot Actuator
@SpringBootApplication
public class MyMicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(MyMicroserviceApplication.class, args);
}
}
2. Build Database-Related Logic (Entities, Repositories, and DTOs)
Define a database entity using the @Entity annotation, a primary key using @Id, and a repository interface.
@Entity
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String accountNumber;
private Double balance;
}
Create a repository interface:
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {
}
DTO for transferring data:
public class AccountDTO {
private String accountNumber;
private Double balance;
}
3. Build Business Logic (Service Layer)
Create a service class with business logic using @Service and @Transactional.
@Service
public class AccountService {
private final AccountRepository accountRepository;
@Autowired
public AccountService(AccountRepository accountRepository) {
this.accountRepository = accountRepository;
}
@Transactional
public Account createAccount(AccountDTO accountDTO) {
Account account = new Account();
account.setAccountNumber(accountDTO.getAccountNumber());
account.setBalance(accountDTO.getBalance());
return accountRepository.save(account);
}
}
4. Build Global Exception Handling Logic
Use @ControllerAdvice and @ExceptionHandler to handle exceptions globally.
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFoundException(ResourceNotFoundException ex) {
ErrorResponse errorResponse = new ErrorResponse("NOT_FOUND", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
}
5. Perform Data Validation on the Input
Use @Valid, @NotNull, @Size, and other validation annotations in DTOs.
public class AccountDTO {
@NotNull
@Size(min = 10, max = 10)
private String accountNumber;
@NotNull
@Min(0)
private Double balance;
}
In the controller, validate the DTO:
@RestController
public class AccountController {
private final AccountService accountService;
@Autowired
public AccountController(AccountService accountService) {
this.accountService = accountService;
}
@PostMapping("/accounts")
public ResponseEntity<Account> createAccount(@Valid @RequestBody AccountDTO accountDTO) {
return new ResponseEntity<>(accountService.createAccount(accountDTO), HttpStatus.CREATED);
}
}
6. Perform Auditing Using Spring Data JPA
Enable auditing using @EnableJpaAuditing and mark the entity fields with auditing annotations like @CreatedDate and @LastModifiedDate.
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
Enable auditing in the Spring Boot application class:
@SpringBootApplication
@EnableJpaAuditing
public class MyMicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(MyMicroserviceApplication.class, args);
}
}
7. Documenting REST API Using Springdoc OpenAPI
Add annotations such as @Operation, @ApiResponse, and @Schema to document your API.
@RestController
@Tag(name = "Account Controller", description = "REST APIs for managing accounts")
public class AccountController {
@Operation(summary = "Create an account")
@ApiResponse(responseCode = "201", description = "Account created successfully")
@ApiResponse(responseCode = "400", description = "Invalid input")
@PostMapping("/accounts")
public ResponseEntity<Account> createAccount(@Valid @RequestBody AccountDTO accountDTO) {
return new ResponseEntity<>(accountService.createAccount(accountDTO), HttpStatus.CREATED);
}
}
With these steps, you have built a robust, well-documented microservice in Spring Boot!