[ 
https://issues.apache.org/jira/browse/CAMEL-24168?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Federico Mariani updated CAMEL-24168:
-------------------------------------
    Attachment: BindyBigDecimalNoPrecisionIssueTest.java

> 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
>            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)

Reply via email to