Details
-
Improvement
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
2.10.3
-
None
-
Unknown
Description
It looks like camel-bindy does not take into account the class specified in the method:
bindy(BindyType.Csv, MyCamelBeans.TEST.class)
I have class MyCamelBeans which includes several "bindies" among which I have a really simple MyCamelBeans.TEST:
class MyCamelBeans {
@CsvRecord(separator=";",isOrdered=true)
public static final class TEST
... some other @CsvRecord ....
}
I also have some @FixedLengthRecord classes defined in the same package.
If I run the following route:
from("file:data/test?noop=true&idempotent=true&fileName=test.csv&delay=60000")
.split(body(String.class).tokenize("\n")).streaming()
.unmarshal().bindy(BindyType.Csv, MyCamelBeans.TEST.class)
.to("log:DS?level=INFO&showHeaders=true");
Camel (2.10.3) fails with an NPE:
java.lang.NullPointerException
at org.apache.camel.dataformat.bindy.BindyCsvFactory.setDefaultValuesForFields(BindyCsvFactory.java:583)
at org.apache.camel.dataformat.bindy.BindyCsvFactory.bind(BindyCsvFactory.java:230)
if I remove the other bindies, camel-bindy works as expected.
Looking at the code, I've found that in BindyAbstractFactory.java :
/**
- method uses to initialize the model representing the classes who will
- bind the data. This process will scan for classes according to the
- package name provided, check the annotated classes and fields.
* - @throws Exception
*/
public void initModel() throws ExceptionUnknown macro: { // Find classes defined as Model if (packageNames != null) { initModelClasses(this.packageNames); } else if (type != null) { // use the package name from the type as it may refer to types in the same package String pckName = type.getPackage().getName(); initModelClasses(pckName); } else { throw new IllegalArgumentException("Either packagenames or type should be configured"); } }
Looks like bindy scan the package even a class has been specified.
Accordin to Claus, bindy needs to be refactored so it
- requires the class type (no more packages)
- uses the class type as root model
- ... and initializes the model from the root, and follow and
references to other classes (if the root has childs)
This avoids picking up any other models.
And we would know to marshal/unmarshal based on the root.
Attachments
Issue Links
- causes
-
CAMEL-16517 camel-bindy - Doc doesn't reflect FixeLengthRecord annotation changes after CAMEL-5958
- Resolved