Release Notes

Version 2.4.7

New features and improvements

Updated dependencies

The following versions have been updated:





Version 2.4.6

New features and improvements

Updated dependencies

The following versions have been updated:







Version 2.4.5

New features and improvements

Updated dependencies

The following versions have been updated:





Version 2.4.4

New features and improvements

Updated dependencies

The following versions have been updated:






  • Fixed @BindMessages not working on Grid column fields

Version 2.4.3

New features and improvements

Updated dependencies

The following versions have been updated:





Version 2.4.2

New features and improvements

Updated dependencies

The following versions have been updated:



Spring Boot



Compatibility with Spring Dev Tools restored

With this patch version, linkki can be used with Spring Devtools in again.

  • Fixed that added child rows are not visible in hierarchical tables

Version 2.4.1

New features and improvements

Updated dependencies

The following versions have been updated:







LumoConstants no longer necessary

With linkki 2.4.0 we introduced the class LumoConstants because the CSS constants in Vaadin’s LumoUtility were no longer constant expressions (and thus could not be used in annotations). Vaadin 24.1.2 reverted the change, so LumoUtility should now be directly used again - LumoConstants is now deprecated.

Removed generated Vaadin files

Files generated by Vaadin can now be removed from the repository without affecting the speed of the build. The advantage of this is that a Vaadin version update does not cause any further Git differences.

It is not required to list these files in .gitignore since they are automatically deleted by the Vaadin build if they did not exist before.

Affected files, for example:

  • package.json

  • package-lock.json

  • tsconfig.json

  • typed.d.ts

  • vite.config.ts


  • Fixed wrong min-width in @UISection for layouts where the label is above the component

Version 2.4.0

This release brings a new technology baseline that includes Java 17, Spring Boot 3, Jakarta EE 10, Vaadin 24 and Faktor-IPS 23.6. These upgrades not only make it possible for linkki developers to make use of the new features of these platforms, it also ensures that the linkki application relies on the latest technologies that are well supported in the near future.

Java 17

Java 17 is required instead of Java 11. This primarily impacts the build environment, as well as the Java version definition in the pom.xml.

Artifact Names

Due to the upgrade to Vaadin 24, all artifacts have been renamed to use vaadin-flow instead of vaadin23. This includes following dependencies:

  • linkki-core-vaadin23, now linkki-core-vaadin-flow

  • linkki-core-nestedcomponent-vaadin23, now linkki-core-nestedcomponent-vaadin

  • linkki-application-framework-vaadin23, now linkki-application-framework-vaadlin-flow

  • linkki-ips-vaadin23, now linkki-ips-vaadin-flow

Vaadin 24

This Vaadin version primarily updates the technology baseline. In addition, several improvements are made regarding the frontend build. As an example, resources such as CSS are now reloaded on the fly, which accelerates the development process. Vaadin 24 brings several breaking changes that are documented in the Vaadin migration guide. There are several changes that has an effect on linkki users:

  • node.js should be updated to the latest LTS version 18

  • The breaking API changes only have an effect on code that uses Vaadin API directly. There are no resulting linkki API changes. To see all breaking API changes, see Vaadin release notes for Flow Components version 24.0.0 and 24.1.0.

    • Label component was deprecated as it is often misused to display text content. This may lead to unexpected behavior in the UI. Check all usages if they should be replaced by a Span instead. Label is replaced by NativeLabel which still can be used if a <label> element is necessary.

  • Fields from LumoUtility are no longer constant expressions, meaning they can no longer be used in annotations, e.g. @BindStyleNames({ LumoUtility.Flex.AUTO }). linkki now provides the class LumoConstants, that defines the same fields as constant expressions, to mitigate this problem. All existing usages of constants from LumoUtility in annotations should be replaced by LumoConstants.

    Since vaadin 24.1.2, LumoUtility defines constant expressions again. LumoConstants has been deprecated in linkki 2.4.1.
  • The default way frontend resources are included has changed. Consequently, CSS and JavaScript files that are included by using @CSSImport or @JsModule may not be included anymore, if the class on which the files are included are only reachable by reflection or injection. If this problem occurs, an error can be found in the console when the affected page is opened in the browser. To mitigate this issue, the vaadin-maven-plugin should be configured with the configuration parameter optimizeBundle set to false. See Vaadin maven plugin configuration

  • There are some changes in the resulting DOM structure that may impact UI tests and CSS selectors.

    • Some components are now in the light DOM instead of being in the shadow DOM, e.g.:

      • Buttons in MenuBar

      • Elements in DatePicker

      • Elements in Upload

      • Elements in MultiSelectComboBox

    • Some CSS properties have changed, e.g.:

      • --lumo-border-radius is removed. Use --lumo-border-radius-m instead.

      • CSS properties to set the border radius of input fields have changed. --vaadin-input-container-top-end-radius is now --vaadin-input-field-top-end-radius, --vaadin-input-container-bottom-end-raiuds is now --vaadin-input-field-bottom-end-radius

    For all frontend changes, see Vaadin release notes for Vaadin Web Components.

  • Visually, the application looks mostly the same as with Vaadin 23. Following visual changes may need styling adjustments if the previous behavior need to be restored:

    • All Headings (h1 - h6) do not have a default margin anymore. Components in linkki do not have to be adjusted. If headings are used in any other components, check visually if the margin still behave as expected.

    Styling changes can also be found in Vaadin release notes for Vaadin Web Components.

  • The snakeyaml dependency, which is required for using YAML configuration files with Spring Boot, has been excluded by Vaadin in this version. To continue using YAML files, following dependency must manually be added:

  • When using Karibu for unit testing, the version has to be updated to 2.0.0 or greater:

Faktor-IPS 23.6

The linkki Faktor-IPS extension uses the latest Faktor-IPS version 23.6. There are no resulting API changes in the Faktor-IPS extension.

Spring Boot 3 and Jakarta EE 10

Spring-based applications need to upgrade to Spring Boot 3 or Spring framework 6. Spring Boot 2 is no longer supported by Vaadin. The Spring Boot archetype has been upgraded to Spring Boot 3 accordingly.
Due to the Java update, Spring Devtools currently do not work with linkki in some Eclipse versions. Projects that are currently using Devtools for hot reload may need to exclude it temperarily.

Compatibility with Spring Devtools is restored in the patch version 2.4.2.

Non-Spring application needs to be upgraded to be compatible with Jakarta EE 10. The version of the application server may need to upgraded accordingly. The Eclipse version is affected too. Versions older than 23-6 may encounter problems deploying the web project.

New features and improvements

Improvements in Testbench-Extension

The WebDriverExtension has been extended with an additional constructor that can be used by just passing the context path. In that case, the fully qualified URL is built based on the given path together with the defined test driver properties. This prevents that the fully qualified URL always has to be handed over as a whole. The defined test driver system properties can be accessed by DriverProperties.

Hide exception stacktraces in production mode and customize the error dialog

For security reasons, exception stacktraces are not shown in the default error dialog anymore when the application runs in production mode.

To make this behavior and error handling in whole more configurable, following API changes has been made:

Table 1. API changes




This method has been deleted as the application layout is not always easily customizable. The method is moved to AplicationConfig#getErrorHandler().


Deprecated. This class is not used by default anymore.


Deprecated. Use DialogErrorHandler(ErrorDialogConfiguration) instead or implement an own ErrorHandler to use a custom error dialog.

DialogErrorHandler(BiFunction, String)

Deprecated. Use DialogErrorHandler(ErrorDialogConfiguration) instead or implement an own ErrorHandler to use a custom error dialog.

About how to customize error handling, see documentation.

Improved detection for internationalized Strings
Internationalized Strings from super classes and interfaces

In previous versions, internationalized Strings from super classes and interfaces had to be copied to the properties file of the subclass, with the key adjusted to the subclass. This made the internationalization process complicated. With this change, the internationalized Strings from super classes and interfaces are now automatically taken into account by linkki. As a result, only the String aspects that are new in the subclass need to be defined in the properties file. The new mechanism for the detection of internationalized Strings are described in the documentation.

Simplified key pattern for keys without property name

In case of class level aspect such as placeholder or caption, the key used to be PmoClassName__aspectName as the property name is empty. An exception was made for section captions to make it possible to define PmoClassName_caption. This disparity is now resolved in this version. All keys without property name can now be defined with the pattern PmoClassName_aspectName, which omits the second underscore for convenience. The regular pattern PmoClassName__aspectName remains functional and has a higher precedence over the key with only one underscore.

In this example, the section caption would be myNewCaption
API changes

To accommodate these changes, some internal API changes have been made:




Deprecated. Use StaticValueNlsService instead.


Deprecated. The class is being deprecated because it is no longer in use.

  • The class org.linkki.util.Optionals has been deprecated, the Optional class from the JDK now offers corresponding functionality. The replacement methods are linked in the JavaDoc.

  • Excluded the dependency from the compile scoped dependencies of the module linkki-core-vaadin-flow


Sanitization of HTML content

Using @UILabel with htmlContent = true previously did not sanitize the content. To make the behaviour of htmlContent = true more secure by default, the HTML is now automatically sanitized, removing potentially dangerous tags and attributes. Note that the tags img and vaadin-icon are also whitelisted.

The same applies to org.linkki.core.vaadin.component.base.LinkkiText when using HTML content mode (setText(…​, true)).

When user-supplied strings are included in HTML content, they have to be escaped to prevent them from being interpreted as HTML. This can be achieved by using HtmlSanitizer#escapeText.

  • Fixed an incompatibility with ChromeDriver versions 111 and above in linkki-vaadin-flow-testbench-extension

  • Deprecated unused method HierarchicalRowPmo#hasChildRows

  • Fixed unnecessary horizontal scroll bar in ComboBox overlay

  • Fixed wrong timestamp format in error dialogs

  • Fixed falsely marked as invalid combobox with initial non-null but empty representation

  • Added missing CSS tweaks for MultiSelectComboBox (e.g. no max-height for error message)

  • Fixed overlapping labels and input fields in small browser windows