camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dabby11 <marco.dabb...@gmail.com>
Subject camel-bindy issue with header and missing locale
Date Tue, 20 Dec 2016 21:53:04 GMT
Hi,

  I'm developing a route with Camel 2.16.1 that uses Bindy to process a file
with fixed length records. The file consists of a header and many rows.
I'm unmarshalling the stream with the following data format:

BindyFixedLengthDataFormat bindy = new
BindyFixedLengthDataFormat(DocumentRow.class);
bindy.setLocale("default");

and my model classes are something like:

@FixedLengthRecord(header = DocumentHeader.class)
public class DocumentRow {

    ...
       
        @DataField(pos = 10, pattern="+000000000.00;-000000000.00",
precision = 2, length = 13, decimalSeparator = ",")
        private BigDecimal value;

    ...
}

@FixedLengthRecord
public class DocumentHeader {

    ...

        @DataField(pos = 365, pattern="+000000000000.00;-000000000000.00",
precision = 2,  length = 16, decimalSeparator = ",")
        private BigDecimal total;

    ...

}

Bindy fails to parse the DocumentHeader.total field with a
java.lang.NumberFormatException.

It seems the locale specified with bindy.setLocale("default") is not passed
to the inner headerFactory in the BindyFixedLengthDataFormat and Bindy tries
to parse the number calling BigDecimal constructor, instead of parsing it
with DecimalFormat.
Indeed, if I execute the following (ugly!) code before creating the route:

  bindy.getFactory();
                       
  Field field =
BindyFixedLengthDataFormat.class.getDeclaredField("headerFactory");
  field.setAccessible(true);
  BindyFixedLengthFactory headerFactory =
(BindyFixedLengthFactory)field.get(bindy);
                       
  headerFactory.setLocale(bindy.getLocale());

to force the locale, everything's fine.

So I think that in BindyFixedLengthDataFormat.createModelFactory() after
headerFactory creation there should be a call to

    headerFactory.setLocale(getLocale())

or something like that (and a similar line for footerFactory).

I checked 2.17.x and 2.18.x branches of BindyFixedLengthDataFormat.java and
there's not something like this.

So the question is: is this really an issue with Bindy or should I achieve
this result in a different way ?

Regards,
  Marco 



--
View this message in context: http://camel.465427.n5.nabble.com/camel-bindy-issue-with-header-and-missing-locale-tp5791754.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Mime
View raw message