Designing Hexagonal Architecture With Java Pdf |verified| «EXTENDED · BLUEPRINT»
// adapters/persistence/JpaProductRepository.java package com.example.adapters.persistence; import com.example.domain.model.Product; import com.example.domain.spi.ProductRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.Optional; @Component @RequiredArgsConstructor public class JpaProductRepository implements ProductRepository private final SpringDataJpaProductRepository jpaRepository;
// application/service/CreateProductService.java package com.example.application.service; import com.example.application.port.in.CreateProductUseCase; import com.example.domain.model.Money; import com.example.domain.model.Product; import com.example.domain.spi.ProductRepository; import lombok.RequiredArgsConstructor;
@SpringBootTest @Testcontainers class JpaProductRepositoryTest @Container static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15"); @Test void shouldSaveAndRetrieve() // ... real database test designing hexagonal architecture with java pdf
Driving Adapter (REST) → Incoming Port (Interface) → Application Service → Outgoing Port (Interface) ← Driven Adapter (JPA)
// adapters/web/ProductController.java package com.example.adapters.web; import com.example.application.port.in.CreateProductUseCase; import com.example.application.port.in.CreateProductUseCase.CreateProductCommand; import com.example.domain.model.Product; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor public class ProductController private final CreateProductUseCase createProductUseCase; // depends on incoming port // adapters/persistence/JpaProductRepository
public interface ProductRepository Optional<Product> findById(String id); void save(Product product);
// application/port/in/CreateProductUseCase.java (Incoming Port) package com.example.application.port.in; import com.example.domain.model.Product; public interface CreateProductUseCase { Product execute(CreateProductCommand command); postgres = new PostgreSQLContainer<
In traditional layered architecture: Web → Service → Repository → Database