Build Spring Boot 4.0 applications - project setup, REST controllers, dependency injection, configuration, actuator, and testing
91
90%
Does it follow best practices?
Impact
97%
1.79xAverage score across 3 eval scenarios
Passed
No known issues
{
"context": "An agent is asked to migrate a Spring Boot 3.x project to Spring Boot 4.0. The evaluation checks whether the agent correctly applies the many breaking changes in Boot 4, including renamed starters, updated Jackson group IDs, dropped server support, and changed annotations.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Boot version updated",
"description": "Spring Boot parent/plugin version is set to 4.0.5 (not a 3.x version)",
"max_score": 8
},
{
"name": "webmvc starter used",
"description": "The web dependency uses 'spring-boot-starter-webmvc' as the artifact ID (canonical Boot 4 name), not 'spring-boot-starter-web'",
"max_score": 6
},
{
"name": "Jackson group ID updated",
"description": "Jackson core/databind dependencies use the new group ID 'tools.jackson' instead of 'com.fasterxml.jackson'",
"max_score": 8
},
{
"name": "Jackson annotations group unchanged",
"description": "Jackson annotation dependencies still use 'com.fasterxml.jackson.core' (annotations group ID was not changed)",
"max_score": 6
},
{
"name": "No Undertow dependency",
"description": "Undertow is not included as an embedded server (it is not supported in Boot 4)",
"max_score": 6
},
{
"name": "MockitoBean annotation used",
"description": "Test classes use @MockitoBean and/or @MockitoSpyBean instead of the removed @MockBean / @SpyBean",
"max_score": 10
},
{
"name": "AutoConfigureMockMvc added",
"description": "@AutoConfigureMockMvc is added alongside @SpringBootTest when MockMvc is used (no longer auto-configured)",
"max_score": 8
},
{
"name": "Nullable annotation updated",
"description": "Any @Nullable annotations use 'org.jspecify.annotations.Nullable' instead of 'org.springframework.lang.Nullable'",
"max_score": 6
},
{
"name": "aspectj starter used",
"description": "If AOP is present, the starter uses 'spring-boot-starter-aspectj' instead of 'spring-boot-starter-aop'",
"max_score": 5
},
{
"name": "oauth2 starter renamed",
"description": "If OAuth2 client is present, the starter uses 'spring-boot-starter-security-oauth2-client'",
"max_score": 5
},
{
"name": "Jackson property paths updated",
"description": "Jackson serialization properties use 'spring.jackson.json.write.*' and 'spring.jackson.json.read.*' (not 'spring.jackson.write.*' / 'spring.jackson.read.*')",
"max_score": 8
},
{
"name": "tracing property updated",
"description": "Tracing configuration uses 'management.tracing.export.enabled' instead of 'management.tracing.enabled'",
"max_score": 6
},
{
"name": "HttpMessageConverters replaced",
"description": "If message converter customization is present, ServerHttpMessageConvertersCustomizer or ClientHttpMessageConvertersCustomizer is used instead of the deprecated HttpMessageConverters",
"max_score": 5
},
{
"name": "JacksonComponent annotation used",
"description": "If custom serializer beans exist, @JacksonComponent is used instead of @JsonComponent",
"max_score": 5
},
{
"name": "Gradle version requirement",
"description": "If Gradle is used, the wrapper or required version is 8.14+ or 9.x",
"max_score": 4
},
{
"name": "Jersey not added",
"description": "Jersey is not introduced or kept as a JAX-RS provider (dropped in Boot 4)",
"max_score": 4
}
]
}