You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2026/10/06 19:39:00 UTC
[jira] [Resolved] (CAMEL-25151) camel-bindy - a java.util.Date field rejects a valid value that is longer than its pattern (M/d/yyyy with 12/25/2026, h:mm a, MMMM), so Bindy cannot read back dates it has written
[ https://issues.apache.org/jira/browse/CAMEL-25151?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-25151.
---------------------------------
Fix Version/s: 4.23.0
Resolution: Fixed
The fix is merged on main, so it is in Camel 4.23.0:
* aeaf7d9db100 CAMEL-25151: camel-bindy - a java.util.Date value longer than its pattern is parsed
Resolving, as the ticket was not updated when the PR was merged.
_Claude Code on behalf of Claus Ibsen_
> camel-bindy - a java.util.Date field rejects a valid value that is longer than its pattern (M/d/yyyy with 12/25/2026, h:mm a, MMMM), so Bindy cannot read back dates it has written
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25151
> URL: https://issues.apache.org/jira/browse/CAMEL-25151
> Project: Camel
> Issue Type: Bug
> Components: camel-bindy
> Reporter: shashank
> Priority: Minor
> Fix For: 4.23.0
>
>
> {{DateFormatFactory.DatePatternFormat.parse}} (used for every {{java.util.Date}} field of a CSV, fixed-length or key-value pair model) refuses a value that has more characters than the pattern:
> {code:java}
> if (string.length() <= this.pattern.length()) {
> df.setLenient(false);
> return df.parse(string);
> } else {
> throw new FormatException("Date provided does not fit the pattern defined");
> }
> {code}
> A pattern letter count is a minimum width, not a maximum: {{M}}, {{d}}, {{H}} and {{h}} print two digits for values of 10 and more, {{MMMM}} and {{EEEE}} print full names, {{a}} prints {{AM}}/{{PM}} for one letter. So valid dates in the pattern's own format are rejected:
> ||pattern||value||result||
> |{{M/d/yyyy}}|{{12/25/2026}}|FormatException (10 characters for an 8 character pattern)|
> |{{d.M.yyyy}}|{{25.12.2026}}|FormatException|
> |{{MMMM d yyyy}}|{{September 30 2026}}|FormatException|
> |{{h:mm a}}|{{11:45 PM}}, also {{9:05 AM}}|FormatException for every value|
> |{{dd-MM-yyyy}}|{{25-12-2026}}|ok (the width is fixed)|
> This also breaks the round trip: marshal writes {{12/25/2026}} for the pattern {{M/d/yyyy}}, and unmarshal of that text fails with "Date provided does not fit the pattern defined". For {{M/d/yyyy}} about four dates out of five fail (every day from the 10th and every date in October to December).
> The check was added to reject a date followed by other characters, such as {{20090901-10:32:30}} for {{yyyyMMdd}}, because {{DateFormat.parse(String)}} stops at the end of the pattern and ignores the rest. CAMEL-11620 removed the same check from the {{LocalDate}}, {{LocalDateTime}} and {{LocalTime}} factories, but not from the {{java.util.Date}} one.
> h3. Reproduction
> {code:java}
> @CsvRecord(separator = ";")
> public static class Row {
> @DataField(pos = 1, pattern = "M/d/yyyy")
> private Date us;
> }
> // unmarshal of "12/25/2026" -> IllegalArgumentException: Date provided does not fit the pattern defined, position: 1, line: 1
> // marshal of 2026-11-30 gives "11/30/2026", and unmarshal of that text fails the same way
> {code}
> A unit test with the four patterns above fails on main. A small formal model (Lean 4) of the check shows that it accepts the output of {{format}} exactly when every numeric field has no more digits than its pattern letters, and that the fix below accepts every formatted date and still rejects a date followed by other characters.
> h3. Affected versions
> The check is the same in 2.25.0, 3.0.0, 4.0.0, 4.14.0, 4.18.0, 4.22.0 and main.
> h3. Proposed fix
> Keep the check for what it was meant to catch: when the value is longer than the pattern, parse it with a {{ParsePosition}} and accept it only when the whole value was used; otherwise throw the same {{FormatException}} as before:
> {code:java}
> } else {
> df.setLenient(false);
> ParsePosition position = new ParsePosition(0);
> date = df.parse(string, position);
> if (date == null || position.getIndex() != string.length()) {
> throw new FormatException("Date provided does not fit the pattern defined");
> }
> return date;
> }
> {code}
> A value that is not longer than the pattern takes exactly the same path as today, so nothing that is accepted today changes. (Requiring the whole value to be used for every value would be stricter than today: for example {{2026-09-30T10:11:12Z}} with the pattern {{yyyy-MM-dd'T'HH:mm:ss}}, 20 characters for a 21 character pattern because of the quotes, is accepted today with the {{Z}} ignored, and would be rejected.) A date followed by other characters is still rejected with the same {{FormatException}} and message (the existing tests {{BindySimpleCsvUnmarshallTest.testMessageWithErroneousDate}} and {{BindySimpleCsvUnmarshallPositionModifiedTest}} pass unchanged).
> Duplicate check (2026-09-30): JIRA "bindy" with "date" and "pattern", "does not fit the pattern", "java.util.Date": only CAMEL-11620 (java.time, fixed) and older unrelated issues. No open pull request touches the Bindy date factories.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)