3.x.x release notes


New features:

  • added separate ViewElementMode.FILTER_FORM which builds the form group that is rendered in a basic EntityQuery filter form

    • this allows consumers to customize the entire form group for a filter control, separately from the control itself

  • support has been added for configuring Autosuggest controls

  • support for marking an EntityQuery or EntityQueryCondition as translated, see Extending EQL

  • added CSS classes and data attributes on some views to make styling easier, see Styling views

Bug-fixes and minor improvements:

  • a single checkbox can now be used as a control for basic EntityQuery filtering


EntityQuery infrastructure changes:

  • CollectionEntityQueryExecutor now supports a Supplier for the collection

  • an EntityQueryExecutor will now be registered automatically for any Spring Data CrudRepository

    • the default implementation is a CollectionEntityQueryExecutor using the repository to fetch all items

    • previously only JpaSpecificationExecutor and QueryDslPredicateExecutor would register an EntityQueryExecutor

  • EQL predicate property IS EMPTY will now check for empty string or null value when dealing with a string (text) property

New features:

Bug-fixes and minor improvements:

  • fixed bug where list actions were added to table header row on a list view

  • uncaught exceptions are now registered as global validation errors on CRUD views

  • association tabs are now hidden if the user does not have the required AllowableAction on the target entity configuration

  • simple value types (eg a domain-specific id type like AuthorId) will now render a textbox as control

    • general rule is that any custom type without readable/writable properties will yield a textbox control

  • fixed some issues where the ConversionService was being ignored when working with custom id types

  • EQL related:

    • fixed bug where a NullPointerException was thrown if an invalid EQL expression was entered in an advanced filter

    • Java 8 time types are now supported for now() and today() functions

    • custom textbox types (eg email) are now supported for basic filtering

      • this fixes a bug where a property marked with an @Email validator could not be used in basic filtering


This release contains a lot of internal changes, specifically related to the addition of the EntityPropertyController and the EntityPropertiesBinder. Overall upgrading from the previous version should be seamless for most applications.

  • addition of EntityAttributes.FORM_ENCTYPE that can be specified as EntityViewFactory or EntityPropertyDescriptor attribute

    • its value should be the actual enctype that should be used for submitting the form of a form view, eg FormViewElement.ENC_MULTIPART

    • this is especially useful to change the form enctype based on the presence of property descriptors (for example a file property)

    • the attribute on a EntityViewFactory will take precedence, property descriptors will only be inspected if it is missing

  • more options are now available for fieldset property controls

    • a fieldset can now be rendered either as a HTML FieldsetFormElement or using a custom template

    • a custom template can be configured on a property using the ViewElementFieldset.TEMPLATE attribute

    • several default templates have been provided with default styling for common form layouts in Admin Web

    • if no property selector is specified, a fieldset property will select all child properties as its members

  • added support for filtering a list view based on AllowableAction

    • this can be used to hide items from a list view if the user does not have the correct permissions

  • addition of the detail view which offers a readonly view for entities.

    • it’s possible to configure an entity to link to the detail view instead of the update view by default

  • link to the delete view (delete button) has moved from the tab menu (EntityAdminMenu) to the detail and update view

  • embedded association views now include an inner page (tab) title and menu

    • the sub-menu is only rendered if there are at least 2 menu items

    • this allows an additional level of menu items for managing embedded associations

  • addition of the EntityPropertiesBinder which allows more advanced binding of custom properties

    • each property is now backed by an EntityPropertyController which can be used to set behaviour (data fetching, writing) on a single property level

  • collections of embedded objects (eg List<Address>) are now fully supported and a default UI control will be generated

  • several bugfixes and minor improvements:

    • fixed some issues with using UUID or other custom types as id for entities

    • added default control support for ZonedDateTime and Duration

    • added EQL support for CONTAINS NULL as an alternative to IS EMPTY

      • this can be used in combination with groups: CONTAINS (NULL,1) is the equivalent or CONTAINS 1 or IS EMPTY

      • this also fixes some issues when using a collection type property in a basic EQL filter

    • improved EQL support for negative operands: NOT CONTAINS (1,2) now expands to NOT CONTAINS 1 AND NOT CONTAINS 2


  • if an EntityAssociation has a custom EntityFactory attribute, that factory will be used for both new instance and DTO creation

    • previously it was only used for new instance creation

  • EntityModule now uses evo-inflector to auto-generate plural forms, this should yield better results in English

  • the String formats of auditable properties can now be customized using global message codes:

    • Auditable.createdDate

    • Auditable.created

    • Auditable.lastModifiedDate

    • Auditable.lastModified

  • several minor issues with EQL filtering have been fixed

  • EntityQuery condition translation is now done recursively as long as the result is modified

  • a CollectionEntityQueryExecutor implementation has been added that can be used to query a collection of objects if there is an EntityPropertyRegistry which provides the property metadata of the collection members


  • the module dependencies for EntityModule have been optimized for re-use

    • as a result EntityModule no longer transitively pulls in BootstrapUiModule or AdminWebModule

    • when used without BootstrapUiModule, no default ViewElement rendering infrastructure will be available

    • when used with BootstrapUiModule but without AdminWebModule, the default views for an entity will never get created and view support (EntityViewFactory) will be disabled

  • added support for LocalDate, LocalTime and LocalDateTime to be rendered using DateTimeFormElement

  • it is now possible to configure default view element modes (eg. control or readonly rendering) on an EntityConfiguration

    • these will be used in all cases where no specific configuration has been configured on property level

  • configuration & view builders support AttributeRegistrar for registering or removing attributes

    • using AttributeRegistrar is useful if you want to use the owner of the attribute collection (eg. the EntityConfiguration)

    • common default registrars can be found in the EntityAttributeRegistrars utility class

  • entity views can now have a collection of configuration attributes

    • attributes can be used to influence or extend default behaviour, new attributes are available for permission checking and admin menu rendering

    • during view rendering attributes are accessible (and can be modified) using EntityViewRequest.getConfigurationAttributes()

  • improvements to view configuration

    • EntityViewFactoryAttributes.ADMIN_MENU attribute can be used to specify if a view should have an admin menu item added

    • EntityViewFactoryAttributes.ACCESS_VALIDATOR attribute can be used to determine how access to the view should be validated

  • added an ExtensionViewProcessorAdapter base class for easily creating a view for a custom extension class (see how-to)

  • added EntityViewCustomizers utility class providing some helpers for customizing EntityViewFactoryBuilder in a chainable fashion

  • EntityModule no longer creates its own Validator instance, the registerForMvc related settings have been removed

    • the validator used by EntityModule is the default MVC validator

  • it’s now possible to define a different message code prefix for module entities using properties

  • you can now force the required status of a control by setting the EntityAttributes.REQUIRED_PROPERTY attribute to true or false on an EntityPropertyDescriptor

  • message codes for form groups and fieldsets have been extended, apart from [description], there is now also built-in support for [help] and [tooltip]

    • this constitutes a minor breaking change in that [description] content is now always rendered above the control of a form group. Previously this could be different depending on the type of control inside the form group.

    • see the section configuring form controls text for a full explanation of the new message codes

  • the behaviour of when controls are prefixed with entity. has been changed

    • when using EntityViewCommand all property controls of the base entity will should be prefixed with entity. in order to map on the EntityViewCommand.entity values

    • previously this was done always when an EntityViewCommand was found on the ViewElementBuilderContext

    • in the new version this is only done if there is also an attribute EntityPropertyControlNamePostProcessor.PREFIX_CONTROL_NAMES explicitly set to true on the builder context

      • the latter is done automatically by the PropertyRenderingViewProcessor when building the initial controls

    • though not intentionally breaking, this change can have side effects with controls no longer being prefixed, developers are encouraged to test the custom forms they have

  • new components for linking to entity views have been introduced

    • the old EntityLinkBuilder interface and attributes are deprecated, but should still work as before

    • see the chapter on linking to entity views for an overview of the new components