Skip to content

8.0.x FIX: Overriding bean definition for bean 'dispatcherServlet' with a different definition#15775

Open
codeconsole wants to merge 1 commit into
apache:8.0.xfrom
codeconsole:fix/dispatcher-servlet-autoconfig-backoff
Open

8.0.x FIX: Overriding bean definition for bean 'dispatcherServlet' with a different definition#15775
codeconsole wants to merge 1 commit into
apache:8.0.xfrom
codeconsole:fix/dispatcher-servlet-autoconfig-backoff

Conversation

@codeconsole

@codeconsole codeconsole commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

What

ControllersAutoConfiguration defines its own dispatcherServlet (a GrailsDispatcherServlet) and dispatcherServletRegistration beans, but it is not ordered before Spring Boot's DispatcherServletAutoConfiguration. As a result Spring Boot registers its own beans first and Grails overrides them on startup:

INFO  o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'dispatcherServlet' with a different definition:
  replacing [... DispatcherServletAutoConfiguration$DispatcherServletConfiguration ...]
  with      [... ControllersAutoConfiguration ...]
INFO  o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'dispatcherServletRegistration' with a different definition:
  replacing [... DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration ...]
  with      [... ControllersAutoConfiguration ...]

This emits two INFO Overriding bean definition messages and depends on spring.main.allow-bean-definition-overriding to win.

Change

Add DispatcherServletAutoConfiguration to the existing @AutoConfiguration(before = …) list:

@AutoConfiguration(
        before = {DispatcherServletAutoConfiguration.class, HttpEncodingAutoConfiguration.class, WebMvcAutoConfiguration.class},
        after = {GrailsDomainClassAutoConfiguration.class}
)

Grails now registers dispatcherServlet / dispatcherServletRegistration first, so Spring Boot's DefaultDispatcherServletCondition and DispatcherServletRegistrationCondition find the existing beans and back off through their own conditions rather than being overridden.

Why it's safe

  • Runtime behavior is unchanged — GrailsDispatcherServlet still handles requests in both cases; only the registration mechanism changes (back-off instead of override).
  • Converts an override into idiomatic auto-configuration ordering and removes two INFO log lines, reducing reliance on bean-definition overriding.

Verification

  • ./gradlew :grails-controllers:compileGroovy — BUILD SUCCESSFUL.
  • Mechanism follows Spring Boot's DefaultDispatcherServletCondition (backs off when a dispatcherServlet-named DispatcherServlet bean already exists).

ControllersAutoConfiguration defines its own `dispatcherServlet` (a
GrailsDispatcherServlet) and `dispatcherServletRegistration` beans, but it
was not ordered before Spring Boot's DispatcherServletAutoConfiguration.
Spring Boot therefore registered its own beans first and Grails overrode
them, producing two INFO "Overriding bean definition for bean
'dispatcherServlet'/'dispatcherServletRegistration'" messages on startup
and relying on bean-definition overriding to win.

Add DispatcherServletAutoConfiguration to the auto-configuration `before`
list so Grails registers these beans first. Spring Boot's
DefaultDispatcherServletCondition and DispatcherServletRegistrationCondition
then see the existing beans and back off via their own conditions instead of
being overridden. Runtime behavior is unchanged - GrailsDispatcherServlet
still handles requests - but the override and its log noise are eliminated.
@codeconsole codeconsole force-pushed the fix/dispatcher-servlet-autoconfig-backoff branch from 15b6cd0 to c87af0f Compare June 26, 2026 21:51
@testlens-app

testlens-app Bot commented Jun 26, 2026

Copy link
Copy Markdown

✅ All tests passed ✅

🏷️ Commit: c87af0f
▶️ Tests: 43228 executed
⚪️ Checks: 44/44 completed


Learn more about TestLens at testlens.app.

@codeconsole codeconsole changed the title Back off Spring Boot's DispatcherServlet auto-configuration instead of overriding it 8.0.x FIX: Overriding bean definition for bean 'dispatcherServlet' with a different definition Jun 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant