This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/struts.git
commit f6cf6bc595c2c687c79ab2c8a29481b64f7bd158 Author: Lukasz Lenart <[email protected]> AuthorDate: Sun Oct 25 16:05:53 2026 +0100 WW-5811 test(html5): render min/max from java.util.Date XML bounds end to end A date validator with XML bounds on a java.util.Date property renders the configured dates under a non-UTC default zone; converting the bound in UTC instead renders 2025-12-31. Co-Authored-By: Claude Opus 5.5 <[email protected]> --- .../struts2/components/ConstraintAction.java | 9 +++++++++ .../views/jsp/ui/Html5ConstraintRenderingTest.java | 22 ++++++++++++++++++++++ .../components/ConstraintAction-validation.xml | 7 +++++++ 3 files changed, 38 insertions(+) diff --git a/core/src/test/java/org/apache/struts2/components/ConstraintAction.java b/core/src/test/java/org/apache/struts2/components/ConstraintAction.java index 307554bea..d80f82aef 100644 --- a/core/src/test/java/org/apache/struts2/components/ConstraintAction.java +++ b/core/src/test/java/org/apache/struts2/components/ConstraintAction.java @@ -43,6 +43,15 @@ public class ConstraintAction extends ActionSupport { private LocalDateTime meetingAt; private LocalDate startDate; private String dateText; + private Date hiredOn; + + public Date getHiredOn() { + return hiredOn; + } + + public void setHiredOn(Date hiredOn) { + this.hiredOn = hiredOn; + } public LocalDate getStartDate() { return startDate; diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/Html5ConstraintRenderingTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/Html5ConstraintRenderingTest.java index d6f795124..dabcb02d4 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/Html5ConstraintRenderingTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/Html5ConstraintRenderingTest.java @@ -29,6 +29,7 @@ import org.apache.struts2.views.jsp.AbstractUITagTest; import java.util.HashMap; import java.util.Map; +import java.util.TimeZone; import java.util.function.Consumer; import java.util.function.Supplier; @@ -183,6 +184,27 @@ public class Html5ConstraintRenderingTest extends AbstractUITagTest { && output.contains("max=\"2026-12-31\"")); } + /** + * The XML bounds are parsed into server-zone midnights and written back in the same zone, so a + * non-UTC default zone must still render the configured dates. + */ + public void testRendersTheIsoRangeOfAJavaUtilDateBoundOnADateTextField() throws Exception { + TimeZone defaultZone = TimeZone.getDefault(); + TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo")); + try { + String output = renderTag("true", () -> { + DateTextFieldTag date = new DateTextFieldTag(); + date.setName("hiredOn"); + return date; + }); + + assertTrue("expected min and max in: " + output, output.contains("type=\"date\" name=\"hiredOn\"") + && output.contains("min=\"2026-01-01\"") && output.contains("max=\"2026-12-31\"")); + } finally { + TimeZone.setDefault(defaultZone); + } + } + /** * A String property keeps the "" an empty date input submits, which {@code required} accepts. */ diff --git a/core/src/test/resources/org/apache/struts2/components/ConstraintAction-validation.xml b/core/src/test/resources/org/apache/struts2/components/ConstraintAction-validation.xml index 23754c8ad..7b78b0e6c 100644 --- a/core/src/test/resources/org/apache/struts2/components/ConstraintAction-validation.xml +++ b/core/src/test/resources/org/apache/struts2/components/ConstraintAction-validation.xml @@ -73,6 +73,13 @@ <message>start within 2026</message> </field-validator> </field> + <field name="hiredOn"> + <field-validator type="date"> + <param name="min">2026-01-01</param> + <param name="max">2026-12-31</param> + <message>hired within 2026</message> + </field-validator> + </field> <field name="dateText"> <field-validator type="required"> <message>type a date</message>
