Skip to content

feat: Migrate eShopWCFService from WCF/SOAP to Spring Boot 3.5 REST API#7

Open
devin-ai-integration[bot] wants to merge 15 commits into
mainfrom
devin/1779337331-wcf-to-springboot-migration
Open

feat: Migrate eShopWCFService from WCF/SOAP to Spring Boot 3.5 REST API#7
devin-ai-integration[bot] wants to merge 15 commits into
mainfrom
devin/1779337331-wcf-to-springboot-migration

Conversation

@devin-ai-integration
Copy link
Copy Markdown

@devin-ai-integration devin-ai-integration Bot commented May 21, 2026

Summary

Migrates the eShopModernizedNTier/src/eShopWCFService (.NET Framework 4.6.1 WCF SOAP service) to a Spring Boot 3.5 / Java 21 REST API at eShopModernizedNTier/src/eShopWCFService-SpringBoot/.

What was migrated

.NET Source Spring Boot Target
[ServiceContract] / [OperationContract] (SOAP) @RestController with 10 REST/JSON endpoints
EF6 DbContext + DbSet<T> Spring Data JPA JpaRepository<T, ID> (5 repositories)
[DataContract] entity models (5) JPA @Entity classes with Jakarta Validation
Web.config (WCF bindings, EF config) application.yml + Spring profiles (dev/mock/prod)
CatalogServiceMock (in-memory) @Profile("mock") service with preconfigured data
CatalogDBInitializer (EF seed) Flyway migrations + DataInitializer (ApplicationRunner)
Autofac DI (ApplicationModule) Spring @Configuration + @ConditionalOnProperty
Windows Container Dockerfile Multi-stage eclipse-temurin:21 Dockerfile

REST API Endpoints (replacing WCF SOAP operations)

Method Path Replaces WCF Operation
GET /api/catalog/items GetCatalogItems(brandFilter, typeFilter)
GET /api/catalog/items/{id} FindCatalogItem(id)
POST /api/catalog/items CreateCatalogItem(item)
PUT /api/catalog/items/{id} UpdateCatalogItem(item)
DELETE /api/catalog/items/{id} RemoveCatalogItem(item)
GET /api/catalog/brands GetCatalogBrands()
GET /api/catalog/types GetCatalogTypes()
GET /api/catalog/stock GetAvailableStock(date, itemId)
POST /api/catalog/stock CreateAvailableStock(stock)
GET /api/catalog/discounts GetDiscount(date)

Architecture

  • 21 Java source files across model/, repository/, service/, controller/, config/
  • 3 tests passing (context load, security config GET, security config POST without CSRF)
  • Flyway schema + seed data migrations for H2 (dev) — prod profile configured for SQL Server
  • Spring Security with CSRF disabled for REST API, all endpoints public
  • Actuator with health, metrics, info, prometheus endpoints
  • Maven wrapper included for reproducible builds

Build status

  • mvn clean compile — passes
  • mvn test — 3/3 passing

Migration approach

Orchestrated via 3 parallel child Devin sessions:

  1. Child A: JPA entities, repositories, Flyway migrations, data initializer
  2. Child B: Service interfaces/impls, REST controller, exception handler
  3. Child C: Security config, CORS, logging, Dockerfile, README

Review & Testing Checklist for Human

  • Run the app locally: cd eShopModernizedNTier/src/eShopWCFService-SpringBoot && ./mvnw spring-boot:run -Dspring-boot.run.profiles=dev — verify it starts on port 8080 and responds to GET /api/catalog/items with 12 seed catalog items
  • Verify mock profile: Run with -Dspring-boot.run.profiles=mock and confirm in-memory data is served correctly
  • Test CRUD operations: POST a new catalog item with catalogBrandId/catalogTypeId, PUT to update via /api/catalog/items/{id}, DELETE to remove, verify correct HTTP status codes (201, 200, 204) and that brand/type associations are persisted
  • Check stock and discount endpoints: GET /api/catalog/stock?date=2017-09-20&catalogItemId=1 should return 100; GET /api/catalog/discounts?date=2017-09-20 should return the matching discount
  • Review entity mappings: Compare CatalogItem.java fields against CatalogItem.cs to ensure all properties (especially BigDecimal price with precision 19,4) are correctly mapped

Notes

  • The original WCF service at eShopWCFService/ is preserved unchanged — this adds a new eShopWCFService-SpringBoot/ project alongside it
  • The prod profile is configured for SQL Server (mssql-jdbc) to match the original WCF service's database; dev/mock use H2 in-memory
  • The CatalogItemHiLoGenerator was intentionally dropped — replaced by @GeneratedValue(strategy = IDENTITY) which is simpler for the REST API use case
  • The CatalogServiceClient (WCF SOAP proxy) was dropped as REST clients don't need generated proxies

Link to Devin session: https://partner-workshops.devinenterprise.com/sessions/87d7557cd1c24b5aa9788e3cc3a9d666
Requested by: @mbatchelor81


Open in Devin Review

@devin-ai-integration
Copy link
Copy Markdown
Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant