[
https://issues.apache.org/jira/browse/CAMEL-24168?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Federico Mariani reassigned CAMEL-24168:
----------------------------------------
Assignee: Federico Mariani
> camel-bindy - BigDecimal/Double @DataField without explicit precision throws
> ArithmeticException on unmarshal and truncates on marshal
> --------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-24168
> URL: https://issues.apache.org/jira/browse/CAMEL-24168
> Project: Camel
> Issue Type: Bug
> Components: camel-bindy
> Reporter: Federico Mariani
> Assignee: Federico Mariani
> Priority: Major
> Labels: ai-assisted-review, dataformat
> Attachments: BindyBigDecimalNoPrecisionIssueTest.java
>
>
> *Severity:* High
> *Affects:* 4.x (long-standing)
> h3. Problem
> A {{@DataField}} of type {{BigDecimal}} (or {{Double}}) *without* an explicit
> {{precision}} fails to round-trip decimal values. {{@DataField.precision()}}
> defaults to {{0}}. {{AbstractNumberFormat}} clamps {{this.precision =
> precision > 0 ? precision : 0}}, so the "unset" case becomes {{0}}, and
> {{BigDecimalFormatFactory.BigDecimalFormat.parse}}'s guard {{if
> (getPrecision() != -1)}} ({{0 != -1}} -> true) always applies {{setScale(0)}}
> with implicit {{RoundingMode.UNNECESSARY}}. The {{!= -1}} check shows the
> original intent was "-1 = unset", which the clamp destroyed. The
> {{@DataField.rounding()}} attribute is also never passed to this factory.
> h3. Failure scenario (reproduced)
> {{@DataField(pos = 1) BigDecimal amount}} (no precision):
> * unmarshal of {{10.35}} -> {{ArithmeticException: Rounding necessary}}
> (aborts the whole record),
> * marshal of {{new BigDecimal("10.35")}} -> {{"10"}} (silent truncation).
> All suite models set {{precision=2}} explicitly, so this path is untested.
> h3. Suggested fix
> Preserve {{-1}} as "unset" through {{AbstractNumberFormat}} (or skip
> {{setScale}} when no precision was declared) and honor
> {{@DataField.rounding()}}. Note {{BindyNumberTest.testMarshall}} asserts the
> current whole-number formatting for integral values — keep that.
> h3. Reproducer
> Attached {{BindyBigDecimalNoPrecisionIssueTest.java}}: unmarshal test errors
> with {{ArithmeticException: Rounding necessary}}; marshal test gets
> {{10,foo}} instead of {{10.35,foo}}. RED on current code.
> ----
> _Reported by Claude Code on behalf of Federico Mariani (Croway). A failing
> JUnit reproducer (confirmed RED on 4.22.0-SNAPSHOT) is attached._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)