Introduced support for initializing tracking/persistence notification states based on their suppressed state within the active SuppressNotificationContext
Updated trackable domain mapper member supports (DefaultTrackableDomainMapperMemberSupport and JpaTrackableDomainMapperMemberSupport) to check if the specific notification type is suppressed before mapping trackable entities
When executing inside a suppressed context, the stopped field of the corresponding trackable domain NotificationState (userState for ChangeSummaryProducer#TYPE and persistenceState for PersistenceProducer#TYPE) is initialized to true dynamically
Updated NotificationStateInitializingDomainMapperMember to dynamically resolve and set the stopped property based on the suppressed context check of SuppressNotificationContext.isSuppressed(state.getName())
ModelMapper mapping compilation has been refactored to eliminate live object-graph Kryo serialization (and its fragile dependencies like runtime class file transformers patching JDK lambda metafactories). It is replaced by a declarative, highly-efficient Description-Based ModelMapper Cache.
Mappers are compiled and serialized into lightweight JSON descriptors containing purely declarative structure, which is fully compatible with runtime client extensions and Spring-free build generation.
For more details on how to configure and generate these cached descriptors, see the ModelMapper Descriptor Cache documentation.
The interlink WebClient now builds its connector from Extension Common’s shared internal-service connector factory instead of creating its own client on Reactor Netty’s global HttpResources pool.
Outbound interlink traffic is therefore pooled and measured alongside every other internal service-to-service call, under one named pool.
No configuration change is required. The pool, its size and its metrics are configured under broadleaf.common.webclient.connection-pool.* — see the Extension Common 3.0.0 release notes.
An implementation that supplies its own interlinkClientHttpConnector bean keeps that bean and is unaffected, but stays off the shared pool. To join it, build the connector from the injected CommonInternalServiceClientConnectorFactory.
Updated DefaultProjectionFactory to assign an explicit parent package to AutoProjection classes
Some versions of Apache Fury (now Fory), used for serialization/deserialization in Caffeine and EHCache caching implementations, are susceptible to an internal race condition when dealing with unnamed-package classes.
This can result in corrupted output, and cause failures (such as NullPointerException) during cacheable operations.
By ensuring AutoProjection classes have an explicit package, Broadleaf reduces exposure to this edge case.
Fix an issue where ContextInfo#filterByActiveFlag was lost when a ContextInfo was copied, and where restoring the flag after an active-flag-filtered operation wrote to filterByActiveDates instead. Queries run after such an operation could filter on the wrong flag.
Fixed a bug where MappingUtils.setupExtensions did not register mappings from parent classes at a higher precedence than implicit mappings from subclasses.
This led to parent-defined mappings being ignored/unused in some cases.
Fix an issue where a repeated query returned different results than its first execution, because narrowing mutated the CriteriaQuery cached on the query info in place. Narrowing now works against a defensive copy, and the copy carries the same ordering the identifier selection applied, so a page is returned in the order its rows were chosen.
Skipped dormant records (those with no recorded changeTimestamp) when retry handlers query for notification-ready members, so they’re no longer incorrectly picked up for retry.