This is the Vaadin Flow 25.0 release for Vaadin 25.0 using the following baseline stack:
- Java 21
- Spring Boot 4
- Jakarta EE 11
- Jackson 3
- Node.js 24
- Pnpm 11
- Vite 7
- React 19
For easier upgrade from Vaadin Flow 24 follow this guide. Below is the summary of breaking changes and enhancements included into this release.
Main highlights
-
Simpler production build
No production profile needed anymore, development dependencies are optional:
<dependencies> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin</artifactId> </dependency> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-dev</artifactId> <optional>true</optional> </dependency> ... </dependencies> ... <plugin> <groupId>com.vaadin</groupId> <artifactId>vaadin-maven-plugin</artifactId> <version>${vaadin.version}</version> <executions> <execution> <goals> <goal>build-frontend</goal> </goals> </execution> </executions> </plugin>
-
Elemental JSON replaced by high level API
Use Beans, Lists, Sets, Maps in communications and properties management:
MyDto dto = element.getPropertyBean("userData", MyDto.class); element.setPropertyBean("userData", dto); TypeReference<List<MyDto>> typeRef = new TypeReference<List<MyDto>>() { }; List<MyDto> dtos = element.getPropertyBean("userList", typeRef); SimpleBean myBean = new SimpleBean("Item1", 1, true); getElement().executeJs("const simpleBean = $0; div.textContent = `simple: name=${simpleBean.name}, value=${simpleBean.value}, active=${simpleBean.active}`", myBean);
-
Application Styles
Vaadin themes are just stylesheets and can be imported with
@StyleSheet. Hot-swapping experience and minification in production build are fully available.@Themeis deprecated, but supported.@StyleSheet(Aura.STYLESHEET) // or Lumo.STYLESHEET @StyleSheet("styles.css") // stylesheets are located in src/main/resources/META-INF/resources/ @ColorScheme(ColorScheme.Value.DARK) public class Application implements AppShellConfigurator { ... }
This also allows to change the styles, color schemes, themes in runtime:
var remover = page.addStyleSheet(Lumo.STYLESHEET); page.setColorScheme(ColorScheme.Value.DARK); new Button("Change to Aura and light", click -> { remover.remove(); page.setColorScheme(ColorScheme.Value.LIGHT); page.addStyleSheet(Aura.STYLESHEET); });
-
Signal Binding in Element (Experimental)
Various
com.vaadin.flow.dom.Elementfeatures now support signal binding, such as text, attributes, properties,ClassList, andStyle. Example of binding a global counter value to a component's text:private final NumberSignal counter = SignalFactory.IN_MEMORY_SHARED.number("counter"); ... Signal<String> signal = counter.map(value -> String.format("Clicked %.0f times", value)); span.getElement().bindText(signal);
Other enhancements
-
ExtendedClientDetailsare available immediately (screen size, window size, browser timezone, theme name, color scheme, ...) Pull request -
Uploads are sent as raw data, not multipart request. This means the upload can be aborted without sending a full file to the server. Pull request
-
Node is auto-installed into
~/.vaadin/node-<version>instead of overwriting~/.vaadin/node. Pull request -
Add convenient API to set items
Commit · Pull request · IssueAdd convenient API to set items with ListDataView#setItems(Collection).
-
Add Exception to DownloadResponse and TransferContext
Commit · Pull request · IssueAdds DownloadResponse#exception and TransferContext#exception of type java.lang.Exception. Updates DownloadHandlers to fill exception automatically in case of IOException (or RuntimeException, or error in DownloadResponse for InputStreamDownloadHandler).
-
Enable client-side logging in production via localStorage flag (#17935)
Commit · Pull requestAllow dynamic control of browser console logging in production mode by checking localStorage for "vaadin.browserLog" flag. Developers can now enable client-side logging in production using: localStorage.setItem('vaadin.browserLog', 'true') This helps with debugging production issues without requiring JAR modifications or rebuilds.
-
Remove legacy frontend folder fallback
Commit · Pull request · Issue -
Add ModalityMode enum
Commit · Pull requestIntroduce ModalityMode with three modes: STRICT, VISUAL and MODELESS.
-
Add default getDefaultLocale method
Commit · Pull request · IssueLets users of I18nProvider declaratively choose default locale.
-
Add setChildComponentModal(ModalityMode) to UI
Commit · Pull request -
Conditionally load workbox dependencies only when PWA is enabled
Commit · Pull requestMove workbox-core and workbox-precaching from default dependencies to a new workbox folder that is only loaded when PWA is enabled. This reduces unnecessary dependencies for projects that don't use PWA functionality.
-
Make Page.addStyleSheet() return Registration for dynamic removal
Commit · Pull requestEnables dynamic removal of stylesheets added via Page.addStyleSheet() methods by returning a Registration object. When Registration.remove() is called, the corresponding stylesheet is removed from the DOM on the client side.
-
Make RequestUtil#getUrlMapping public for manual security configuration
Commit · Pull request -
Modular feature flag system using Service Provider Interface
Commit · Pull request · IssueRefactored feature flags to use Service Provider Interface (SPI) pattern, allowing each module to define its own feature flags that are dynamically loaded at runtime. This eliminates the need to hardcode all feature flags in the FeatureFlags class.
Breaking changes
-
Flow Gradle plugin uses Gradle 8.14 as a baseline
-
Deprecated API removal (#21396)
See the list of removed classes/methods in the referenced ticket. -
@polymer/polymer dependency is not installed and included by default (#22022)
Use@NpmPackage(value = "@polymer/polymer", version = "3.5.2")if this is needed for your project or add-on. -
Replace Elemental with Jackson in public API and internally (#21060)
-
Remove VaadinWebSecurity
Commit · Pull request · IssueRemoves deprecated
VaadinWebSecurity. This leavesVaadinSecurityConfigurerthe only supported build-in API to secure Vaadin application integrated with Spring Security. Follow the instructions in V24-V25 upgrade guide above to start using it. -
Restrict access by default for url-based security (#21831)
URLs not explicitly specified in security configuration changed from being allowed for authenticated users to restricted by default. This requires extra security rules (path matchers) for URLs that were allowed only for authentication users. -
Deny access if Flow layout has no security annotation (#21832)
Flow layouts now require access annotation (e.g.RolesAllowed) on layout classes. This was added to align with auto-layout default security rules. -
Make server-side modality less strict by default (#22279)
MakesDialogbe less strict and allow background requests to server. Also allows to change this behavior if needed. -
Centralize hierarchy management server-side
Commit · Pull request · Issues 21876, 21877HierarchyMapperandHierarchicalCommunicationControllerhave been replaced with the new concept -Cache. This new class provides a system for storing data in a hierarchical structure while enabling access in a flattened format for client-side consumption.setRequestedRangeandsetParentRequestedRangehave been replaced with a singlesetViewportRangewhich spans all hierarchy levels. -
Changes for Binder.validate()
Binder.validate()implementation has been changed to behave as its javadoc states. In other words,Binder.validate()no longer fails when bean level validators have been configured but no bean is currently set (i.e.Binderis used in buffered mode). -
Remove construct-style-sheets-polyfil (#21675)
-
Move component theme behind feature flag
Commit · Pull requestAdd feature flag for component theme files in
themes/themename/componentsCloses #21608 Overwrite any autoInjectComponents property with the feature flag state. -
Remove theme url translation
Commit · Pull requestDrop translation of url for theme files.
-
No default theme loaded
Commit · Pull request · IssueLumo is not a default theme anymore. If nothing selected (Lumo or Aura), application just uses components base styles.
-
Remove setConfiguration from VaadinSession
Commit · Pull request -
Move CompressUtil to internal package
Commit · Pull request