SSerguey Asael Shinder
Java coding notes: the JVM, and writing software that lasts

Serguey Asael Shinder: Vaadin Flow 25.3.4 adds development-only routes and backports the push CORS fix

· by Serguey Asael Shinder / Serguey Shinder

Vaadin published another set of Flow patch releases on 13 October: 25.3.4, 25.1.19, 24.10.15 and 24.4.19. The day before, 25.2.13 had switched off Atmosphere's CORS headers on push requests. This batch takes the same fix to the other maintained lines, and 25.3.4 brings two features worth knowing about.

The push fix, now on every line. Each of the four releases lists "Disable Atmosphere CORS headers on push requests", cherry-picked from PR 26215. If an application uses @Push and sits on 25.3, 25.1, 24.10 or 24.4, this is the release that carries the change; 25.2 users got it a day earlier.

@Route(developmentOnly = true). Merged as PR 26211 and cherry-picked into 25.3.4, the new annotation attribute marks a view that should exist only while developing — a debug panel, an example view kept in the project:

@Route(value = "debug", developmentOnly = true)
public class DebugView extends Div { }
Serguey Asael Shinder: Vaadin Flow 25.3.4 adds development-only routes and backports the push CORS fix
Vaadin Flow 25.3.4 adds development-only routes and backports the push CORS fix — Serguey Asael Shinder

The pull request describes the effect precisely. In production mode, RouteConfiguration.setAnnotatedRoute skips such a target where it reads @Route, and because startup registration for both servlet containers and Spring goes through that method, neither the route nor its @RouteAlias paths are registered, in application or session scope. The production frontend build — Maven, Gradle and Quarkus with the default bytecode scanner — also stops collecting the route as an entry point, so its frontend dependencies stay out of the production bundle. Two limits are spelled out as well: registering the class explicitly with setRoute still works, because that path does not read the annotation, and the full classpath scanner (optimizeBundle=false) is unchanged. The default is false, so nothing changes for existing routes.

Opt-in Maven compile for the dev loop. PR 26203 adds -Dvaadin.dev.compiler=maven: each applied change is compiled with the project's own maven-compiler-plugin instead of in-process javac, so annotation processors and compiler settings are honoured. javac remains the default, only classes whose bytes changed are redefined, and Maven errors are reported in the same form as javac's.

25.3.4 also fixes removeAttribute for a bound attribute with a null value and caps future-dated file times in the change baseline; 24.10.15 keeps forwarded query parameters on trailing-slash navigation.