What's Changed
Breaking Changes π
- Remove BeanIntrospectionModule by @yawkat in #12207
- Match jackson feature names and add config for remaining features by @yawkat in #12237
- application/x-yaml -> application/yaml by @altro3 in #10613
New Features π
- Support for creating AOP proxies at Runtime if necessary by @dstepanov in #12223
- Generation of JSON schema from Micronaut Configuration Properties by @graemerocher in #12377
- Refactor multipart by @yawkat in #12246
- Minor Changes to support Truffle polyglot languages by @graemerocher in #12435
- Add programmatic retry and circuit breaker APIs by @graemerocher in #12585
- Add config import support and importer SPI by @graemerocher in #12571
- Add jakarta Priority annotation mapper by @graemerocher in #12592
- Expand thread-selection behavior by @yawkat in #12439
- Async Http Client by @dstepanov in #12629
- Add h2c prior-knowledge client support by @yawkat in #12555
Bug Fixes π
- Fix missing annotations with
RECORD_COMPONENTtarget by @dstepanov in #12184 - Add support for less buggy multipart decoder by @yawkat in #12202
- Fix context beans are not singleton in some cases by @dstepanov in #12276
- Preserving Body Related Headers When Following 307 or 308 Redirects by @everett-hayes in #12271
- In CORS Filter add GET as available method for static resources by @sdelamo in #12279
- Don't dispose request body on HTTP/2 RST by @yawkat in #12332
- add null check for environment by @graemerocher in #12380
- Fix duplicate content-type header bug, add test by @wfhartford-wordly in #12376
- annotation valueMapper can return null by @sdelamo in #12393
- fix: prevent denial of service submitting form-url-encoded payload by @sdelamo in #12410
- Fix GraalVM 25 loom-carrier native image initialization by @yawkat in #12418
- Fix NettyHttpServerSpec dual-protocol client leak by @yawkat in #12424
- fix: avoid Path @QueryValue StackOverflow in declarative clients by @yawkat in #12421
- fix @EachProperty env entry lookup for hyphenated prefixes by @yawkat in #12419
- fix: preserve SSL configuration when refreshing netty HTTP client by @yawkat in #12434
- Fix flaky HttpClientTraceLoggingSpec log iteration (#12441) by @yawkat in #12442
- Fix request context availability in coroutine context factories by @yawkat in #12461
- test: add /beans runtime definition collision regression by @yawkat in #12465
- fix: avoid containsBean cache race during concurrent cache clears by @yawkat in #12462
- Stabilize JsonStreamSpec streaming request tests by @yawkat in #12458
- fix(inject-kotlin): preserve boxed getter signature for overridden primitive properties by @yawkat in #12469
- fix(http-client-jdk): honor named service SSL config in JDK client by @yawkat in #12473
- Fix Reactor HTTP client retry resubscription by @yawkat in #12470
- Propagate context for default error fallback logging by @yawkat in #12471
- Make ClassImport repeatable by @yawkat in #12485
- Add FileCustomizableResponseType body writer by @yawkat in #12481
- Clarify maxHeaderSize documentation by @yawkat in #12511
- Avoid iterating lazy property sources for config imports by @graemerocher in #12628
- Fix Kotlin default dispatch for inherited methods by @lissam1 in #12670
Improvements β
- Improvements to the bean context in v5 by @dstepanov in #12045
- Precalculate indexes and isParallel for beans by @dstepanov in #12050
- Avoid using service loading accessible classes by @dstepanov in #12067
- Bean context improvements by @dstepanov in #12066
- Isolate tests + fix looking for all beans by @dstepanov in #12076
- Precalculate replaces at compilation time by @dstepanov in #12086
- Remove TypeThrashingTest by @yawkat in #12199
- test: reduce test pollution with spec.name by @sdelamo in #12208
- executable method processor and eager initialization by @sdelamo in #12180
- Pass HttpRequest to getLoadBalancerDiscriminator() by @iamsb97 in #12173
- Prepare JsonMapper for Jackson 3 and ReadBuffer by @yawkat in #12236
- New leak detection for tests by @yawkat in #12139
- Add explicit
@Targetto@Internalannotation for Groovy 5 compatibility and JLS compliance. by @ayoube-ait in #12314 - Apply request-decompression-enabled config to HTTP/2 by @yawkat in #12334
- Add
@NullMarkedto all packages in tck modules by @dstepanov in #12344 - Support Authentication as a valid WebSocket handler argument by @zManu3k in #12357
- Jackson2 annotation support by @yawkat in #12408
- Fail fast on duplicate configuration resources (with configurable merge/first-match) by @graemerocher in #12383
- Changes to support Micronaut processors as a Native Image by @graemerocher in #12449
- Add %q and %U access log elements for Netty by @yawkat in #12456
- Promote HTTP/3 support to stable by @yawkat in #12466
- test: add regression for @bindable defaults on config interfaces by @graemerocher in #12484
- Change default for CrossOrigin.allowCredentials by @yawkat in #12614
- Raise test-library baseline to Java 25 by @graemerocher in #12644
Docs π
- Docs: Add note about YAML reserved words in ConfigurationProperties by @nikitanagar08 in #12427
- Document @RouteCondition annotation for conditional routing by @Copilot in #12428
- Document custom HTTP client DNS resolver snippets by @yawkat in #12474
- Clarify JsonMapper and ObjectMapper guidance by @yawkat in #12525
- Clarify @controller port javadoc by @yawkat in #12534
- Fix whatsNew.adoc section heading levels and "scoped values" terminology by @graemerocher in #12603
Dependency updates π
- chore(deps): update graalvm/setup-graalvm action to v1.4.2 by @renovate[bot] in #12160
- fix(deps): update dependency ch.qos.logback:logback-classic to v1.5.20 by @renovate[bot] in #12162
- chore(deps): update plugin io.micronaut.build.shared.settings to v7.6.6 by @renovate[bot] in #12155
- chore(deps): update plugin io.micronaut.build.shared.settings to v8.0.0-m9 by @renovate[bot] in #12166
- chore(deps): update softprops/action-gh-release action to v2.4.2 by @renovate[bot] in #12174
- fix(deps): update dependency ch.qos.logback:logback-classic to v1.5.21 by @renovate[bot] in #12186
- chore(deps): update gradle to v9.2.1 by @renovate[bot] in #12204
- fix(deps): update dependency com.github.javaparser:javaparser-symbol-solver-core to v3.27.1 by @renovate[bot] in #12210
- fix(deps): update dependency com.github.spotbugs:spotbugs-annotations to v4.9.8 by @renovate[bot] in #12212
- fix(deps): update dependency io.github.classgraph:classgraph to v4.8.184 by @renovate[bot] in #12213
- fix(deps): update dependency io.micronaut.build.internal:micronaut-gradle-plugins to v7.6.6 by @renovate[bot] in #12214
- fix(deps): update dependency org.graalvm.buildtools.native:org.graalvm.buildtools.native.gradle.plugin to v0.11.3 by @renovate[bot] in #12221
- chore(deps): update graalvm/setup-graalvm action to v1.4.3 by @renovate[bot] in #12228
- chore(deps): update plugin io.micronaut.build.shared.settings to v8.0.0-m12 by @renovate[bot] in #12230
- fix(deps): update bytebuddy to v1.18.2 by @renovate[bot] in #12233
- Groovy 5.0.3 by @sdelamo in #12241
- chore(deps): update graalvm/setup-graalvm action to v1.4.4 by @renovate[bot] in #12245
- fix(deps): update dependency org.graalvm.sdk:nativeimage to v23.1.9 by @renovate[bot] in #12248
- fix(deps): update dependency org.projectlombok:lombok to v1.18.42 by @renovate[bot] in #12253
- fix(deps): update dependency org.spockframework:spock-core to v2.4-groovy-5.0-snapshot by @renovate[bot] in #12257
- fix(deps): update dependency ch.qos.logback:logback-classic to v1.5.22 by @renovate[bot] in #12263
- Spock 2.4 by @sdelamo in #12269
- [CVE-2025-67735] Update managed-netty version to 4.2.9.Final by @alvarosanchez in #12274
- [CVE-2025-67735] Update managed-netty version to 4.2.9.Final by @alvarosanchez in #12275
- chore(deps): update plugin io.micronaut.build.shared.settings to v8.0.0-m13 by @renovate[bot] in #12278
- fix(deps): update dependency org.testcontainers:spock to v1.21.4 by @renovate[bot] in #12281
- fix(deps): update dependency org.zalando:logbook-netty to v3.12.3 by @renovate[bot] in #12282
- fix(deps): update bytebuddy to v1.18.3 by @renovate[bot] in #12284
- Update to Kotlin 2.3 and use ZacSweers' kotlin-compile-testing by @sdelamo in #12318
- fix(deps): update dependency ch.qos.logback:logback-classic to v1.5.24 by @renovate[bot] in #12290
- fix(deps): update vertx to v4.5.23 by @renovate[bot] in #12293
- fix(deps): update dependency io.micronaut.sourcegen:micronaut-sourcegen-bom to v1.8.4 by @renovate[bot] in #12291
- chore(deps): update graalvm/setup-graalvm action to v1.4.5 by @renovate[bot] in #12322
- chore(deps): update plugin io.micronaut.build.shared.settings to v8.0.0-m14 by @renovate[bot] in #12324
- Upgrade log4j to version 2.25.3 by @sdelamo in #12327
- Update dependency org.sonatype.gradle.plugins:scan-gradle-plugin to v3.1.4 by @renovate[bot] in #12343
- Update native-gradle-plugin version by @graemerocher in #12378
- upgrade logback to 1.5.25 by @graemerocher in #12379
- Update dependency ch.qos.logback:logback-classic to v1.5.29 by @renovate[bot] in #12382
- fix(deps): update bytebuddy to v1.18.4 by @renovate[bot] in #12355
- fix(deps): update dependency com.blazebit:blaze-persistence-core-impl to v1.6.18 by @renovate[bot] in #12387
- fix(deps): update dependency io.micronaut.reactor:micronaut-reactor-bom to v4.0.0-snapshot by @renovate[bot] in #12300
- fix(deps): update dependency io.micronaut.rxjava3:micronaut-rxjava3-bom to v4.0.0-snapshot by @renovate[bot] in #12304
- fix(deps): update dependency io.micronaut.validation:micronaut-validation-bom to v5.0.0-snapshot by @renovate[bot] in #12307
- fix(deps): update micronaut.sql to v7.0.0 by @renovate[bot] in #10876
- chore(deps): update plugin io.micronaut.build.shared.settings to v8.0.0-m17 by @renovate[bot] in #12390
- fix(deps): update bytebuddy to v1.18.5 by @renovate[bot] in #12391
- fix(deps): update dependency io.netty:netty-tcnative-boringssl-static to v2.0.75.final by @renovate[bot] in #12400
- fix(deps): update dependency ch.qos.logback:logback-classic to v1.5.32 by @renovate[bot] in #12392
- fix(deps): update dependency org.graalvm.sdk:nativeimage to v23.1.10 by @renovate[bot] in #12402
- fix(deps): update groovy monorepo to v5.0.4 by @renovate[bot] in #12403
- fix(deps): update kotlin monorepo to v2.3.10 by @renovate[bot] in #12404
- fix(deps): update ksp monorepo to v2.3.6 by @renovate[bot] in #12414
- fix(deps): update bytebuddy to v1.18.6-jdk6-jdk5 by @renovate[bot] in #12415
- fix(deps): update bytebuddy to v1.18.7 by @renovate[bot] in #12417
- fix(deps): update micronaut.test to v5.0.0-snapshot by @renovate[bot] in #12426
- fix(deps): update dependency io.micronaut.sourcegen:micronaut-sourcegen-bom to v2.0.0-m2 by @renovate[bot] in #12349
- fix(deps): update jackson monorepo by @renovate[bot] in #12286
- fix(deps): update netty monorepo to v4.2.10.final by @renovate[bot] in #12448
- fix(deps): update vertx to v4.5.25 by @renovate[bot] in #12464
- fix(deps): update dependency org.projectlombok:lombok to v1.18.44 by @renovate[bot] in #12480
- build: graal & graalvm native dependency managed by @sdelamo in #12490
- fix(deps): update kotlin monorepo to v2.3.20 by @renovate[bot] in #12503
- chore(deps): update softprops/action-gh-release action to v2.6.1 by @renovate[bot] in #12531
- chore(deps): update gradle to v9.4.0 by @renovate[bot] in #12521
- chore(deps): update gradle to v9.4.1 by @renovate[bot] in #12536
- fix(deps): update dependency com.fasterxml.jackson.core:jackson-databind to v2.21.2 by @renovate[bot] in #12551
- update to Jackson 2.21.1 by @sdelamo in #12510
- fix(deps): update netty monorepo to v4.2.12.final by @sdelamo in #12568
- Jackson upgrade to 2.21.2 by @sdelamo in #12587
- fix(deps): update dependency org.apache.logging.log4j:log4j-core to v2.25.4 by @renovate[bot] in #12584
- fix(deps): update dependency org.sonatype.gradle.plugins:scan-gradle-plugin to v3.1.5 by @renovate[bot] in #12580
- fix(deps): update vertx to v4.5.26 by @renovate[bot] in #12569
- fix(deps): update dependency net.ltgt.errorprone:net.ltgt.errorprone.gradle.plugin to v4.4.0 by @renovate[bot] in #12562
- fix(deps): update dependency com.google.errorprone:error_prone_core to v2.48.0 by @renovate[bot] in #12552
- Update bytebuddy to v1.18.8 by @renovate[bot] in #12613
- Update dependency com.github.javaparser:javaparser-symbol-solver-core to v3.28.0 by @renovate[bot] in #12325
- Update bcpkix to jdk18on by @yawkat in #12624
- Update dependency io.micronaut.reactor:micronaut-reactor-bom to v4.0.0-M2 by @renovate[bot] in #12616
- Update dependency io.micronaut.validation:micronaut-validation-bom to v5.0.0-M2 by @renovate[bot] in #12622
- Update dependency io.netty:netty-tcnative-boringssl-static to v2.0.77.Final by @renovate[bot] in #12635
- Update dependency org.projectlombok:lombok to v1.18.46 by @renovate[bot] in #12641
- Update dependency org.graalvm.sdk:nativeimage to v25.0.3 by @renovate[bot] in #12639
- Update jackson monorepo by @renovate[bot] in #12648
- Update dependency com.h2database:h2 to v2.4.240 by @renovate[bot] in #11014
- Update kotlin monorepo to v2.3.21 by @renovate[bot] in #12656
- Update groovy monorepo to v5.0.5 by @renovate[bot] in #12647
- Update jackson monorepo by @renovate[bot] in #12649
- Update managed-groovy version to 5.0.6 by @sdelamo in #12669
- fix(deps): update dependency com.uber.nullaway:nullaway to v0.13.1 by @renovate[bot] in #12554
Regressions π§
Other Changes π‘
- Improvements to bean context qualifiers by @dstepanov in #12053
- Drop support for Kotlin 1.9 by @melix in #12164
- Fix lookup of annotation processors in Java 25 by @melix in #12175
- test: isolate ConstantPropertySourceSpec in its own module by @sdelamo in #12195
- test: ProxyBackpressureTest run localy reduced cvssource by @sdelamo in #12196
- test: ignore LoomCarrierSpec for MacOS by @sdelamo in #12197
- build: disable htmlSanityCheck by @sdelamo in #12198
- Introduce a Micronaut module descriptor by @melix in #12192
- Improvements to runtime annotation processors by @dstepanov in #12068
- use Jspecify annotations in APIs by @sdelamo in #12200
- build: accept version and library regiression from netty-contrib-mult⦠by @sdelamo in #12219
- Upgrade to Groovy 5 by @melix in #12170
- Make http header list size configurable in HTTP client for HTTP2 by @Pavlov7 in #12172
- Refactor
InterceptorRegistryto use@NullMarkedby @dstepanov in #12224 - JSpecify @nullable with @QueryValue constructor parameter by @sdelamo in #12216
- Update to jackson 3 by @iamsb97 in #12165
RuntimeProxycan be@Retention(SOURCE)to eliminate the annotation by @dstepanov in #12227- Fix BeanIntrospection to handle primitive types in property lookup by @yashdoshi in #12142
- create JsonMapper.Builder as prototype bean by @sdelamo in #12239
- Application context improvements by @dstepanov in #12259
- Revert "fix(deps): update dependency org.spockframework:spock-core to v2.4-groovy-5.0-snapshot" by @dstepanov in #12261
- Add bean configurations predicate support by @dstepanov in #12277
- Fixed usage of custom environments in the bootstrap context by @msupic in #12287
- Create a fix for native image build with ContextConfigurer on GraalVM 22+ by @andriy-dmytruk in #12310
- adds a contract to isEmpty and isNotEmpty methods by @musketyr in #12264
- Fixed refresh of bootstrap property sources by @msupic in #12289
- Correct
@Nullableand@NonNullon arrays by @dstepanov in #12320 - Add
@NullMarkedto all packages inhttpby @dstepanov in #12333 - Add
@NullMarkedto all packages in core by @dstepanov in #12331 - Add
@NullMarkedto all packages ininjectby @dstepanov in #12336 - Add
@NullMarkedto all packages inhttp-clientby @dstepanov in #12338 - Add
@NullMarkedto all packages in more modules by @dstepanov in #12342 - Add
@NullMarkedto all packages in json/jackson by @dstepanov in #12341 - Add
@NullMarkedto all packages inhttp-server-nettyby @dstepanov in #12340 - Add
@NullMarkedto all packages inhttp-nettyby @dstepanov in #12339 - Add
@NullMarkedto all packages in context by @dstepanov in #12346 - Add
@NullMarkedto all packages inaopby @dstepanov in #12347 - Add
@NullMarkedto all packages in websocket, router by @dstepanov in #12348 - Add @NullMarked to all packages in core-processor by @dstepanov in #12345
- Integrate NullAway for core module only by @dstepanov in #12354
- Return error on QueryValue conversion failures by @iamsb97 in #12321
- Integrate NullAway for context, http, inject router by @dstepanov in #12360
- Fix environment missing in configuration packages require conditions by @dstepanov in #12362
- Integrate NullAway for http-client by @dstepanov in #12363
- Integrate NullAway and Jspecify NullMarked for http-client-core by @dstepanov in #12365
- Integrate NullAway for http-server, http-netty by @dstepanov in #12367
- Integrate NullAway for whole project by @dstepanov in #12368
- Remove remaining NonNull on NullMarked packages by @dstepanov in #12369
- Correct "post construct" generation in bean definition writer by @dstepanov in #12372
- feat(12135): Adding support for list access using env variables by @davidgammon-mettle in #12136
- Correct nullability of ConversionService#convertRequired by @dstepanov in #12388
- Add FunctionInitilizerTest by @sdelamo in #12396
- Fix executor fallback by allowing null-named UserExecutorConfiguration by @lissam1 in #12401
- Remove incorrect SafeVarargs by @dstepanov in #12420
- Fix identification getters / setters for properties with second upper case symbol. For example eTemperature by @altro3 in #10130
- fix: avoid wildcard default content type for responses by @yawkat in #12452
- test: add regression for RequestBean record path variable binding by @yawkat in #12436
- test: add regression coverage for optional query value multipart streaming by @yawkat in #12454
- Fix: Relative redirects not resolved against request URI by @ArtemLikhitskiy in #12395
- test: add GOAWAY next-request connection regression by @yawkat in #12478
- Update graal version to 25.0.2 by @sdelamo in #12468
- Remove dependency to micronaut-rxjava2 by @sdelamo in #12489
- Fix checkstyle errors and warnings by @Copilot in #12497
- fix: MediaType can decode quoted charset by @valtercorreia in #12385
- Relax FormBindingDeadlockTest JSON assertion by @yawkat in #12499
- Add regression test for zero-length MultipartBody part by @yawkat in #12505
- Add non-security regression test for HttpStatusException behavior on 5.0.x by @yawkat in #12507
- Clarify Retryable capturedException Javadoc by @yawkat in #12508
- Preserve source bean order for EachBean delegates by @yawkat in #12520
- Handle health monitor scheduler rejection during shutdown by @yawkat in #12527
- Handle long Lombok builder introspection names by @yawkat in #12526
- Return 400 for malformed WebSocket upgrade URIs by @yawkat in #12519
- Expose additional Netty HTTP client parser limits by @yawkat in #12529
- Fix parsing of fully qualified type identifiers in ctx[...] expressions by @yawkat in #12523
- Run websocket upgrade completion on event loop by @yawkat in #12528
- Propagation context - scope values by @dstepanov in #12509
- Clarify bootstrap requirements for custom distributed configuration by @yawkat in #12538
- Preserve empty string elements when binding string query lists by @yawkat in #12546
- Clarify TypedAnnotationMapper processor classpath requirements by @yawkat in #12542
- Add regression coverage for blank form request bean values by @yawkat in #12533
- Guard Jackson constructType against incomplete generics by @yawkat in #12558
- Preserve runtime annotations on intercepted proxy methods by @yawkat in #12544
- Preserve HEAD content-length for proxied multiplexed responses by @yawkat in #12563
- Preserve @nAmed BeanRegistration identifiers across singleton reuse by @yawkat in #12564
- Clarify MutableHttpMessage header semantics by @yawkat in #12566
- Correct ScopedValues changes by @dstepanov in #12561
- Correct this "|" to "||". by @sdelamo in #12573
- Conversion service already in abstract argument binder by @sdelamo in #12575
- Add regression test for declarative Mono no-content response by @yawkat in #12550
- rename fields to avoid sonar issues by @sdelamo in #12572
- Change propagated context default to thread local by @graemerocher in #12605
- Correct FormsJacksonAnnotationsTest TCK by @dstepanov in #12602
- Make @retryable capture Exception by default by @iamsb97 in #12141
- Fix recursive ConcurrentHashMap.computeIfAbsent in RefreshScope.getOrCreate() by @Copilot in #12582
- fix #12651: reuse underlying HttpClient in toBlocking() to prevent thread leak by @naborka in #12652
- Fix KSP not visiting inner classes by @dstepanov in #12673
New Contributors
- @Pavlov7 made their first contribution in #12172
- @yashdoshi made their first contribution in #12142
- @everett-hayes made their first contribution in #12271
- @ayoube-ait made their first contribution in #12314
- @davidgammon-mettle made their first contribution in #12136
- @zManu3k made their first contribution in #12357
- @wfhartford-wordly made their first contribution in #12376
- @nikitanagar08 made their first contribution in #12427
- @ArtemLikhitskiy made their first contribution in #12395
- @valtercorreia made their first contribution in #12385
- @naborka made their first contribution in #12652
Full Changelog: v4.10.23...v5.0.0