From c0ae68eabec67ac45f6edf28467f5f400c38c3b4 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 29 Jun 2026 11:51:35 -0700 Subject: [PATCH] Fix field error handling in BeanViewForms --- api/src/org/labkey/api/data/BeanViewForm.java | 10 ++++++++++ api/src/org/labkey/api/data/TableViewForm.java | 9 +++++++-- api/src/org/labkey/api/query/UserSchemaAction.java | 3 +-- .../labkey/study/pipeline/FileAnalysisDatasetTask.java | 3 +-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/api/src/org/labkey/api/data/BeanViewForm.java b/api/src/org/labkey/api/data/BeanViewForm.java index e098b951fe4..752c04e732f 100644 --- a/api/src/org/labkey/api/data/BeanViewForm.java +++ b/api/src/org/labkey/api/data/BeanViewForm.java @@ -20,7 +20,10 @@ import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.DynaClass; +import org.labkey.api.action.BaseViewAction.BeanUtilsPropertyBindingResult; import org.labkey.api.action.HasBindParameters; +import org.labkey.api.action.NullSafeBindException; +import org.springframework.validation.BindException; import java.util.HashMap; import java.util.Map; @@ -86,6 +89,13 @@ public void setBean(K bean) setTypedValues(factory.toMap(bean, null), false); } + @Override + public BindException createErrors() + { + // Teaches Spring to resolve field names via string lookups instead of getters. e.g., errors.rejectValue(). + return new NullSafeBindException(new BeanUtilsPropertyBindingResult(this, "form")); + } + @Override public Map getValuesToBind() { diff --git a/api/src/org/labkey/api/data/TableViewForm.java b/api/src/org/labkey/api/data/TableViewForm.java index 66dcde6349d..36cadf8bf9c 100644 --- a/api/src/org/labkey/api/data/TableViewForm.java +++ b/api/src/org/labkey/api/data/TableViewForm.java @@ -30,7 +30,6 @@ import org.labkey.api.action.NullSafeBindException; import org.labkey.api.action.SpringActionController; import org.labkey.api.collections.CaseInsensitiveHashMap; -import org.labkey.api.ontology.Quantity; import org.labkey.api.query.FieldKey; import org.labkey.api.security.permissions.DeletePermission; import org.labkey.api.security.permissions.InsertPermission; @@ -897,10 +896,16 @@ else if (orig.getName().startsWith(ARRAY_MARKER) && orig.getValue()!=null) setValueToBind(pv.getName(), pv.getValue()); } - BindException errors = new NullSafeBindException(this, "form"); + BindException errors = createErrors(); validateBind(errors); return errors; } + + // Construct and return a BindException that's appropriate for this form + public BindException createErrors() + { + return new NullSafeBindException(this, "form"); + } } diff --git a/api/src/org/labkey/api/query/UserSchemaAction.java b/api/src/org/labkey/api/query/UserSchemaAction.java index 4f267a9c678..f2ba8aea605 100644 --- a/api/src/org/labkey/api/query/UserSchemaAction.java +++ b/api/src/org/labkey/api/query/UserSchemaAction.java @@ -17,7 +17,6 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.action.FormViewAction; -import org.labkey.api.action.NullSafeBindException; import org.labkey.api.action.SpringActionController; import org.labkey.api.attachments.SpringAttachmentFile; import org.labkey.api.audit.TransactionAuditProvider; @@ -79,7 +78,7 @@ public BindException bindParameters(PropertyValues m) throws Exception QueryUpdateForm command = new QueryUpdateForm(_table, getViewContext(), null); if (command.isBulkUpdate()) command.setValidateRequired(false); - BindException errors = new NullSafeBindException(new BeanUtilsPropertyBindingResult(command, "form")); + BindException errors = command.createErrors(); command.validateBind(errors); return errors; } diff --git a/study/src/org/labkey/study/pipeline/FileAnalysisDatasetTask.java b/study/src/org/labkey/study/pipeline/FileAnalysisDatasetTask.java index 136b69eacc1..bb6dceafc3f 100644 --- a/study/src/org/labkey/study/pipeline/FileAnalysisDatasetTask.java +++ b/study/src/org/labkey/study/pipeline/FileAnalysisDatasetTask.java @@ -16,7 +16,6 @@ package org.labkey.study.pipeline; import org.jetbrains.annotations.NotNull; -import org.labkey.api.action.BaseViewAction; import org.labkey.api.action.NullSafeBindException; import org.labkey.api.admin.PipelineJobLoggerGetter; import org.labkey.api.assay.transform.DataTransformService; @@ -114,7 +113,7 @@ else if (params.containsKey(DataTransformService.ORIGINAL_SOURCE_PATH)) for (String error : readerErrors) _ctx.getLogger().error(error); - BindException errors = new NullSafeBindException(new BaseViewAction.BeanUtilsPropertyBindingResult(this, "pipeline")); + BindException errors = new NullSafeBindException(this, "pipeline"); boolean allowDomainUpdates = true; if (_ctx.getProperties().containsKey(StudyImportContext.ALLOW_DOMAIN_UPDATES)) allowDomainUpdates = Boolean.parseBoolean(_ctx.getProperties().get(StudyImportContext.ALLOW_DOMAIN_UPDATES));