Skip to content

Clear omitted bindData fields when nullMissing is enabled - #15950

Open
jamesfredley wants to merge 11 commits into
fix/binddata-mass-assignmentfrom
fix/binddata-null-missing-stale-data
Open

Clear omitted bindData fields when nullMissing is enabled#15950
jamesfredley wants to merge 11 commits into
fix/binddata-mass-assignmentfrom
fix/binddata-null-missing-stale-data

Conversation

@jamesfredley

@jamesfredley jamesfredley commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Description

Adds opt-in stale-data clearing to bindData, stacked on the binding base from #15947.

When nullMissing: true is supplied together with an explicit include list, included properties omitted from the source are cleared (reference types to null, primitives to their type default). Existing behavior is unchanged when the option is absent, false, or no explicit include was supplied.

Final contract

Area Behavior
Opt-in bindData(target, source, [include: [...], nullMissing: true])
Default Omitted fields retain their existing value
Authorization Explicit includes and (in secure mode) generated binding allowlists authorize clearing
Denials Excludes, bindable: false, and framework-managed properties remain protected
Primitives Omitted included primitives reset to the type default (e.g. 0 / false)
Failures Clear failures are reported on the returned BindingResult
Paths Nested objects, lists, arrays, maps, indexed paths, and filters are supported
Wildcards Wildcard matching is isolated to nullMissing; it cannot broaden normal request binding
Compatibility Existing public overloads continue to delegate with nullMissing = false
Modes Works under the shipping permissive default and under opt-in secure mode

Implementation notes

Example

bindData book, params, [include: ['title', 'description'], nullMissing: true]

Verification

  • :grails-web-databinding:test
  • :grails-databinding-core:test
  • Focused BindDataMethodTests (default-mode and secure-mode nullMissing paths, primitives, BindingResult errors, nested/indexed/maps, excludes, bindable: false)
  • DefaultASTDatabindingHelperDomainClassSpecialPropertiesSpec (explicit bindable special properties)

Related

PR Relationship
#15947 Binding base (permissive default + opt-in secure mode) merged into this PR
#15808 Earlier combined approach, closed as superseded by #15947 and #15950

Contributor Checklist

  • Tests cover the affected public behavior in the shipping default mode
  • User-facing behavior is documented in the bindData reference and Grails 8 upgrade guide
  • Default behavior and existing overloads remain compatible
  • The PR is labeled ai-generated-starting-point
  • All contributed code is provided under the Apache License 2.0

Assisted-by: Sisyphus:xai/grok-4.5 [gpt-coding]

When nullMissing is true and an include allowlist is provided, omitted
allowlisted properties are set to null. Default remains leave-unchanged.

Assisted-by: Sisyphus:xai/grok-4.5 [gpt-coding]

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds opt-in “null missing” semantics to bindData so that, when nullMissing: true is provided alongside an explicit include allowlist, included properties omitted from the binding source are actively cleared (null) rather than leaving stale values on the target object. This extends Grails’ web data binding behavior to better support typical “edit/update” form semantics without enabling the behavior by default.

Changes:

  • Introduces a nullMissing option plumbed through DataBinderDataBindingUtils, and applies clearing only when an explicit include list is provided.
  • Implements missing-field clearing logic in DataBindingUtils (including nested indexed collection paths and map-indexed paths).
  • Adds test coverage and updates documentation + upgrading notes to describe the new opt-in behavior.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java Adds nullMissing overloads and implements missing included-property clearing logic after binding.
grails-web-databinding/src/main/groovy/grails/web/databinding/DataBinder.groovy Wires nullMissing: true from the bindData options map into the binding call.
grails-test-suite-web/src/test/groovy/org/grails/web/servlet/BindDataMethodTests.groovy Adds new controller-backed specs covering nullMissing clearing, excludes, nested indexed paths, map paths, and bindable whitelist interactions.
grails-doc/src/en/ref/Controllers/bindData.adoc Documents nullMissing usage and constraints (opt-in; requires include).
grails-doc/src/en/guide/upgrading/upgrading80x.adoc Notes the behavior change for Grails 8.x upgrades (opt-in; only with include).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@bito-code-review

Copy link
Copy Markdown

The observation regarding isPropertyAllowedByWhitelist is accurate. The current implementation relies on exact matches and simple prefix checks, which fails to account for the wildcard semantics used by the binder (e.g., address.* or address_*). Updating the whitelist evaluation to support these patterns would ensure that nested properties are correctly identified as bindable, allowing nullMissing to function consistently across nested paths.

@codecov

codecov Bot commented Jul 10, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 2.42826% with 442 lines in your changes missing coverage. Please review.
✅ Project coverage is 51.5762%. Comparing base (73a0555) to head (50714be).

Files with missing lines Patch % Lines
...ls/web/databinding/NullMissingPropertyClearer.java 0.0000% 418 Missing ⚠️
...roovy/grails/web/databinding/DataBindingUtils.java 17.3913% 12 Missing and 7 partials ⚠️
.../grails/web/databinding/GrailsWebDataBinder.groovy 40.0000% 1 Missing and 2 partials ⚠️
.../groovy/grails/databinding/SimpleDataBinder.groovy 50.0000% 0 Missing and 2 partials ⚠️
Additional details and impacted files

Impacted file tree graph

@@                          Coverage Diff                           @@
##             fix/binddata-mass-assignment     #15950        +/-   ##
======================================================================
- Coverage                         51.8932%   51.5762%   -0.3170%     
- Complexity                          18114      18214       +100     
======================================================================
  Files                                2038       2048        +10     
  Lines                               96213      97227      +1014     
  Branches                            16778      16995       +217     
======================================================================
+ Hits                                49928      50146       +218     
- Misses                              38899      39654       +755     
- Partials                             7386       7427        +41     
Files with missing lines Coverage Δ
...ovy/grails/databinding/FrameworkPropertyNames.java 100.0000% <100.0000%> (ø)
.../groovy/grails/databinding/SimpleDataBinder.groovy 74.5050% <50.0000%> (-0.1219%) ⬇️
.../grails/web/databinding/GrailsWebDataBinder.groovy 30.5172% <40.0000%> (+0.1200%) ⬆️
...roovy/grails/web/databinding/DataBindingUtils.java 54.0936% <17.3913%> (-2.3879%) ⬇️
...ls/web/databinding/NullMissingPropertyClearer.java 0.0000% <0.0000%> (ø)

... and 17 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Preserve the strict binding allowlist while adding opt-in stale-data clearing, including indexed paths and explicit include handling.

Assisted-by: opencode:gpt-5.6-sol
@jamesfredley

Copy link
Copy Markdown
Contributor Author

Final update pushed in 018220fb3e.

The branch now incorporates #15947 as its deny-by-default security base and keeps nullMissing as a focused opt-in behavior. Review fixes cover wildcard sibling authorization, indexed excludes and includes, explicit include semantics, null generated allowlists, public boolean overload safety, recursive bindable: false, and framework-managed properties.

Verification passed for :grails-databinding-core:test, :grails-databinding:test, :grails-web-databinding:test, and :grails-test-suite-web:test. The final delta completed three rounds of Oracle and Codex review; all findings within #15950's six-file stacked scope are resolved.

@jamesfredley jamesfredley moved this to Todo in Apache Grails Jul 24, 2026
@borinquenkid

Copy link
Copy Markdown
Member

Thanks for splitting this out — since #15950 is branched directly off #15947, its diff currently duplicates all of #15947's changes on top of the nullMissing additions, which means reviewers end up reviewing the mass-assignment hardening twice.

Would you be open to one of:

  1. Retargeting this PR's base branch to fix/binddata-mass-assignment (the Add opt-in deny-by-default data binding and always honor bindable:false #15947 branch), so this shows only the incremental nullMissing commits — GitHub will auto-retarget it to 8.0.x once Add opt-in deny-by-default data binding and always honor bindable:false #15947 merges, or
  2. Folding this PR's commits into Add opt-in deny-by-default data binding and always honor bindable:false #15947 so it's reviewed as a single PR.

Whichever is easier on your end — just flagging so we don't duplicate review effort.

@borinquenkid borinquenkid added this to the grails:8.0.0-RC1 milestone Jul 28, 2026
@jamesfredley
jamesfredley changed the base branch from 8.0.x to fix/binddata-mass-assignment July 29, 2026 13:45
@jamesfredley

Copy link
Copy Markdown
Contributor Author

PR updated to target fix/binddata-mass-assignment

@jdaugherty jdaugherty left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The nullMissing contract is well scoped — opt-in, requires an explicit include, defaults unchanged — and the reference docs read clearly.

Two structural concerns before this lands.

First, the clearing pass re-derives "which included properties were absent from the source" by re-parsing the binding source after binding has already finished. That is why DataBindingUtils grows roughly 640 lines of bespoke path handling, duplicating traversal the binder just performed and already has type information for.

Second, every nullMissing spec inherits legacyBindableDefault=false from the BindDataMethodTests setup(), so the feature has no coverage under the shipping default — even though the docs present it as a plain bindData option with no mention of the binding mode.

Smaller items inline.

return bindingResult;
}

private static void assignNullToMissingIncludedProperties(Object object, DataBindingSource bindingSource, List include, List exclude, String filter) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is where the cost of the design shows up. assignNullToMissingIncludedProperties re-walks the binding source after grailsWebDataBinder.bind(...) has returned, and to do that it re-implements path splitting (splitPropertyPath, propertyPathSeparator), bracket and index parsing, checkbox marker names, collection and map expansion, and prefix-filter handling — a second implementation of the grammar the binder just traversed with IndexedPropertyReferenceDescriptor and processIndexedProperty.

Two implementations of the same path grammar will drift, and this is the copy that decides which properties get written to. shouldExpandMapEntries / isStructuredMapValueType inferring "is this a nested object map?" from the package name of the value type is a symptom of working without the type information the binder had already resolved.

Could the clearing be driven from inside the binder instead — it already holds the resolved allowlist and knows which properties it set, so the remainder is the set to null? If that is not workable, please extract this into its own collaborator with its own unit tests rather than growing DataBindingUtils, which is already carrying the include-list resolution and the mode switch.

return null;
}

private static void setPropertyValueToNull(Object object, String propertyName) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Every failure here is swallowed. A nullMissing clear that cannot be applied — a primitive-typed property, a property with no setter, a setter that throws — silently leaves the stale value in place, which is exactly the outcome the option exists to prevent, and nothing is recorded in the BindingResult that bindData returns.

The catch comment says "ignore invalid indexed nullMissing paths", but the try also covers the non-indexed mc.setProperty(...) branch, so it is broader than the comment claims.

Please narrow the catch to the path/index parsing, decide explicitly what a primitive-typed include should do (reject it at the API, or set the type default), and surface a failure to clear through the errors object the way a binding failure is surfaced. A test with a primitive property in the include list would pin whichever behavior you choose.

private static final String BLANK = "";
private static final Map<Class, List> CLASS_TO_BINDING_INCLUDE_LIST = new ConcurrentHashMap<>();
private static final Map<Class, List> CLASS_TO_LEGACY_BINDING_INCLUDE_LIST = new ConcurrentHashMap<>();
private static final Set<String> FRAMEWORK_MANAGED_PROPERTIES = Set.of(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is now the third list of "properties the binder must never touch" in the stack, and the three disagree:

  • SimpleDataBinder.isFrameworkProperty: class, classLoader, protectionDomain, metaClass, metaPropertyValues, properties
  • GrailsWebDataBinder.FRAMEWORK_MANAGED_PROPERTIES: class, errors, id, version, dateCreated, lastUpdated
  • this one: the union of both

A property added to one and not the others becomes clearable but not bindable, or the reverse. Please consolidate to a single constant that all three consume.

return bindObjectToInstance(object, source, include, exclude, filter, false);
}

public static BindingResult bindObjectToInstance(Object object, Object source, List include, List exclude, String filter, boolean nullMissing) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This overload and the matching bindObjectToDomainInstance(..., boolean nullMissing) are new public API on a class where the neighbouring overloads are documented.

Please add javadoc covering the parameter, the fact that it is ignored unless the caller supplied a non-null include, and that the clearing happens after binding completes — outside the listener callbacks and outside the BindingResult the method returns.

whiteList.any { item -> item?.toString()?.startsWith(propName + '.') })
}

static boolean isPropertyExcluded(String propertyName, List excludeList) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This adds a public static method to grails.databinding.SimpleDataBinder — public API in grails-databinding-core — solely so DataBindingUtils in grails-web-databinding can call it. It also implements exclusion semantics (.* and _* prefix matching, and nested-path prefixes) that the binder's own isOkToBind does not apply, so SimpleDataBinder now exposes two different notions of "excluded".

It has no javadoc and no coverage in SimpleDataBinderSpec. If it is only needed by the web binding layer, please make it package-private there or move it to a shared internal utility; if it is genuinely meant to be public API, document it and test it at the SimpleDataBinder level.

target.email == null
}

void 'Test bindData With Null Missing Clears Omitted Included Field'() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This spec and every other nullMissing case in the file inherit legacyBindableDefault=false from the setup() at the top, so the whole feature is only exercised in the opt-in secure mode.

The reference docs and the 8.0.x upgrade note both present nullMissing as a plain bindData option with no mention of the binding mode, and the authorization path genuinely differs between the two: isNullMissingPropertyBindable consults getBindingIncludeList(object), which resolves the legacy allowlist under the default and the generated one under secure mode.

Please add default-mode coverage for the main paths — clearing an omitted included field, leaving an excluded one, honouring bindable: false, and the nested/indexed cases — so the documented behavior is verified in the mode most applications will be running.

…ssing-stale-data

Preserve permissive compatibility binding and the nullMissing stale-data clearing behavior while resolving overlapping documentation, tests, and binding utilities.

Assisted-by: opencode:gpt-5.6-sol
Use one shared property-name set across the core and web binders while preserving the internal bind-all marker across package boundaries.

Assisted-by: opencode:gpt-5.6-sol
Move omitted-property path handling into a dedicated collaborator, preserve existing binding errors, report clear failures, and reset primitive properties to type defaults.

Assisted-by: opencode:gpt-5.6-sol
Remove the duplicate specification cleanup that referenced per-feature state and prevented the merged test source from compiling.

Assisted-by: opencode:gpt-5.6-sol
SimpleDataBinder must only hard-deny intrinsic runtime properties.
Grails-managed id/version/dateCreated/lastUpdated/errors remain
excluded from default allowlists and nullMissing clearing, but can
still bind when explicitly allowed (bindable: true).

Assisted-by: Sisyphus:xai/grok-4.5
@jamesfredley

Copy link
Copy Markdown
Contributor Author

@jdaugherty Addressed after merging the updated #15947 base (50714be10c).

Review responses

Item Resolution
Post-bind path re-walk (~640 lines in DataBindingUtils) Extracted to package-private NullMissingPropertyClearer with coverage through public bindData / DataBindingUtils APIs. Clearing remains intentionally post-bind (documented).
nullMissing only tested under secure mode After the #15947 merge, BindDataMethodTests runs on the unconfigured permissive default. Added/kept default-mode coverage for clear omitted include, leave excluded, bindable: false, nested/indexed/map paths. Secure-mode cases stay explicit via enableSecureBinding().
Swallowed clear failures Primitive includes reset to the type default. Clear failures produce FieldErrors on the returned BindingResult (full nested path preserved); existing conversion errors are kept.
Three disagreeing framework-property lists Single FrameworkPropertyNames with intrinsic runtime vs Grails-managed sets. SimpleDataBinder only hard-denies intrinsic runtime properties so bindable: true on id/dateCreated/lastUpdated still works; nullMissing uses the full managed set.
Missing javadoc on public nullMissing overloads Documented: ignored without a non-null include; clearing runs after bind; listener/BindingResult behavior described.
Public SimpleDataBinder.isPropertyExcluded Removed from public API; exclusion matching lives in the web-layer clearer.

Verification

:grails-databinding-core:test, :grails-web-databinding:test, and focused :grails-test-suite-web:test (BindDataMethodTests, DefaultASTDatabindingHelperDomainClassSpecialPropertiesSpec) all green.

@testlens-app

testlens-app Bot commented Aug 2, 2026

Copy link
Copy Markdown

🚨 TestLens detected 40 failed tests 🚨

Here is what you can do:

  1. Inspect the test failures carefully.
  2. If you are convinced that some of the tests are flaky, you can mute them below.
  3. Finally, trigger a rerun by checking the rerun checkbox.

Test Summary

CI / Build Grails-Core (macos-latest, 21) > :grails-test-suite-persistence:test

Test Runs Flakiness
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include 0% 🟢
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors 0% 🟢

CI / Build Grails-Core (ubuntu-latest, 21) > :grails-test-suite-persistence:test

Test Runs Flakiness
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include 0% 🟢
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors 0% 🟢

CI / Build Grails-Core (ubuntu-latest, 25) > :grails-test-suite-persistence:test

Test Runs Flakiness
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include 0% 🟢
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors 0% 🟢

CI / Build Grails-Core (windows-latest, 25) > :grails-test-suite-persistence:test

Test Runs Flakiness
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include 0% 🟢
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors 0% 🟢

CI / Build Grails-Core Rerunning all Tasks (ubuntu-latest, 21) > :grails-test-suite-persistence:test

Test Runs Flakiness
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include 0% 🟢
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors 0% 🟢

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-acl-functional-test-app:integrationTest

Test Runs Flakiness
AdminFunctionalSpec 1% 🟡
User1FunctionalSpec 1% 🟡
User2FunctionalSpec 1% 🟡

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-core-misc-functional-test-app-group:integrationTest

Test Runs Flakiness
SecuredControllerSpec 1% 🟡

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-core-misc-functional-test-app-roles:integrationTest

Test Runs Flakiness
SecuredControllerSpec 1% 🟡

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-ldap-custom-user-details-context-mapper:integrationTest

Test Runs Flakiness
CustomUserDetailsContextMapperFunctionalSpec 1% 🟡

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-ldap-functional-test-app:integrationTest

Test Runs Flakiness
Person1FunctionalSpec 1% 🟡
Person2FunctionalSpec 1% 🟡
Person3FunctionalSpec 1% 🟡

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-ldap-retrieve-db-roles:integrationTest

Test Runs Flakiness
RetrieveDbRolesFunctionalSpec 1% 🟡

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-ldap-retrieve-group-roles:integrationTest

Test Runs Flakiness
RetrieveGroupRolesFunctionalSpec 1% 🟡

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-ui-extended:integrationTest

Test Runs Flakiness
AclClassSpec 1% 🟡
AclEntrySpec 1% 🟡
AclObjectIdentitySpec 1% 🟡
AclSidSpec 1% 🟡
ExtendedMenuSpec 1% 🟡
ExtendedSecurityInfoSpec 1% 🟡
PersistentLoginSpec 1% 🟡
RegisterSpec 1% 🟡
RegistrationCodeSpec 1% 🟡
RequestmapSpec 1% 🟡
RoleSpec 1% 🟡
UserSpec 1% 🟡

CI / Spring Security Tests (21) > :grails-test-examples-spring-security-ui-simple:integrationTest

Test Runs Flakiness
DefaultMenuSpec 1% 🟡
DefaultSecurityInfoSpec 1% 🟡
RegisterSpec 1% 🟡
RegistrationCodeSpec 1% 🟡
RequestmapSpec 1% 🟡
RoleSpec 1% 🟡
UserSimpleSpec 1% 🟡

🏷️ Commit: 50714be
▶️ Tests: 41880 executed
⚪️ Checks: 55/55 completed

Test Failures (first 10 of 40)

GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include (:grails-test-suite-persistence:test in CI / Build Grails-Core (macos-latest, 21))
Condition not satisfied:

holder.values.isEmpty()
|      |      |
|      |      false
|      [first:grails.web.databinding.SecureMapConstructorValue@2e1c8027]
<grails.web.databinding.SecureMapConstructorHolder@7b6b99c5 values=inaccessible arrayValues=inaccessible grails_validation_Validateable__beforeValidateHelper=inaccessible grails_validation_Validateable__errors=inaccessible>

	at grails.web.databinding.GrailsWebDataBinderSpec.Test Map constructor fallback fails closed for a narrow explicit include(GrailsWebDataBinderSpec.groovy:651)
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors (:grails-test-suite-persistence:test in CI / Build Grails-Core (macos-latest, 21))
Condition not satisfied:

bindingErrors*.propertyName.contains('quantity')
|              |            |
[]             []           false

	at grails.web.databinding.GrailsWebDataBinderSpec.Test typed Map binding in default mode notifies listeners and records value conversion errors(GrailsWebDataBinderSpec.groovy:680)
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include (:grails-test-suite-persistence:test in CI / Build Grails-Core (ubuntu-latest, 21))
Condition not satisfied:

holder.values.isEmpty()
|      |      |
|      |      false
|      [first:grails.web.databinding.SecureMapConstructorValue@1ae23815]
<grails.web.databinding.SecureMapConstructorHolder@740fccd2 values=inaccessible arrayValues=inaccessible grails_validation_Validateable__beforeValidateHelper=inaccessible grails_validation_Validateable__errors=inaccessible>

	at grails.web.databinding.GrailsWebDataBinderSpec.Test Map constructor fallback fails closed for a narrow explicit include(GrailsWebDataBinderSpec.groovy:651)
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors (:grails-test-suite-persistence:test in CI / Build Grails-Core (ubuntu-latest, 21))
Condition not satisfied:

bindingErrors*.propertyName.contains('quantity')
|              |            |
[]             []           false

	at grails.web.databinding.GrailsWebDataBinderSpec.Test typed Map binding in default mode notifies listeners and records value conversion errors(GrailsWebDataBinderSpec.groovy:680)
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include (:grails-test-suite-persistence:test in CI / Build Grails-Core (ubuntu-latest, 25))
Condition not satisfied:

holder.values.isEmpty()
|      |      |
|      |      false
|      [first:grails.web.databinding.SecureMapConstructorValue@245b0bd7]
<grails.web.databinding.SecureMapConstructorHolder@478cc5f1 values=inaccessible arrayValues=inaccessible grails_validation_Validateable__beforeValidateHelper=inaccessible grails_validation_Validateable__errors=inaccessible>

	at grails.web.databinding.GrailsWebDataBinderSpec.Test Map constructor fallback fails closed for a narrow explicit include(GrailsWebDataBinderSpec.groovy:651)
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors (:grails-test-suite-persistence:test in CI / Build Grails-Core (ubuntu-latest, 25))
Condition not satisfied:

bindingErrors*.propertyName.contains('quantity')
|              |            |
[]             []           false

	at grails.web.databinding.GrailsWebDataBinderSpec.Test typed Map binding in default mode notifies listeners and records value conversion errors(GrailsWebDataBinderSpec.groovy:680)
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include (:grails-test-suite-persistence:test in CI / Build Grails-Core (windows-latest, 25))
Condition not satisfied:

holder.values.isEmpty()
|      |      |
|      |      false
|      [first:grails.web.databinding.SecureMapConstructorValue@10466c55]
<grails.web.databinding.SecureMapConstructorHolder@10e4ce98 values=inaccessible arrayValues=inaccessible grails_validation_Validateable__beforeValidateHelper=inaccessible grails_validation_Validateable__errors=inaccessible>

	at grails.web.databinding.GrailsWebDataBinderSpec.Test Map constructor fallback fails closed for a narrow explicit include(GrailsWebDataBinderSpec.groovy:651)
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors (:grails-test-suite-persistence:test in CI / Build Grails-Core (windows-latest, 25))
Condition not satisfied:

bindingErrors*.propertyName.contains('quantity')
|              |            |
[]             []           false

	at grails.web.databinding.GrailsWebDataBinderSpec.Test typed Map binding in default mode notifies listeners and records value conversion errors(GrailsWebDataBinderSpec.groovy:680)
GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include (:grails-test-suite-persistence:test in CI / Build Grails-Core Rerunning all Tasks (ubuntu-latest, 21))
Condition not satisfied:

holder.values.isEmpty()
|      |      |
|      |      false
|      [first:grails.web.databinding.SecureMapConstructorValue@23ee70a7]
<grails.web.databinding.SecureMapConstructorHolder@6ffa8126 values=inaccessible arrayValues=inaccessible grails_validation_Validateable__beforeValidateHelper=inaccessible grails_validation_Validateable__errors=inaccessible>

	at grails.web.databinding.GrailsWebDataBinderSpec.Test Map constructor fallback fails closed for a narrow explicit include(GrailsWebDataBinderSpec.groovy:651)
GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors (:grails-test-suite-persistence:test in CI / Build Grails-Core Rerunning all Tasks (ubuntu-latest, 21))
Condition not satisfied:

bindingErrors*.propertyName.contains('quantity')
|              |            |
[]             []           false

	at grails.web.databinding.GrailsWebDataBinderSpec.Test typed Map binding in default mode notifies listeners and records value conversion errors(GrailsWebDataBinderSpec.groovy:680)

Muted Tests (first 20 of 40)

Select tests to mute in this pull request:

  • AclClassSpec
  • AclEntrySpec
  • AclObjectIdentitySpec
  • AclSidSpec
  • AdminFunctionalSpec
  • CustomUserDetailsContextMapperFunctionalSpec
  • DefaultMenuSpec
  • DefaultSecurityInfoSpec
  • ExtendedMenuSpec
  • ExtendedSecurityInfoSpec
  • GrailsWebDataBinderSpec > Test Map constructor fallback fails closed for a narrow explicit include
  • GrailsWebDataBinderSpec > Test typed Map binding in default mode notifies listeners and records value conversion errors
  • PersistentLoginSpec
  • Person1FunctionalSpec
  • Person2FunctionalSpec
  • Person3FunctionalSpec
  • RegisterSpec
  • RegisterSpec
  • RegistrationCodeSpec
  • RegistrationCodeSpec

Reuse successful test results:

  • ♻️ Only rerun the tests that failed or were muted before

Click the checkbox to trigger a rerun:

  • Rerun jobs

Learn more about TestLens at testlens.app.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

4 participants