I am trying to create a fixedfile reader using Apache Camel Bindy but am getting exception.Please help me to find the solution.Without header and footer which is working well.
Update: File is small to understand now and public is added
File Content:
101-08-2009
30A9
20A9
60A9
40A9
10A9
50A8
9000000002
New Exception:
java.lang.IllegalArgumentException: Some fields are missing (optional or mandatory), line: 2
at org.apache.camel.dataformat.bindy.BindyFixedLengthFactory.bind(BindyFixedLengthFactory.java:295) ~[camel-bindy-2.19.1.jar:2.19.1]
at org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat.createModel(BindyFixedLengthDataFormat.java:294) ~[camel-bindy-2.19.1.jar:2.19.1]
Exception:
org.apache.camel.RuntimeCamelException: java.lang.IllegalAccessException: Class org.apache.camel.util.ObjectHelper can not access a member of class com.camel.examples.OrderHeader with modifiers ""
at org.apache.camel.util.ObjectHelper.newInstance(ObjectHelper.java:1686) ~[camel-core-2.19.1.jar:2.19.1]
Router:
// @Override
public void configure() throws Exception {
Comparator<Order> comparator = new Comparator<Order>() {
@Override
public int compare(Order o1, Order o2) {
return o1.getOrderNr() - o2.getOrderNr();
}
};
DataFormat bindy = new BindyFixedLengthDataFormat(Order.class);
from("file:C:/Users/workspace/SampleProjects/in?delete=true")
.routeId("ValidateFile-Post2Q")
.unmarshal(bindy).split(body().sort(comparator));
Model Java classes:
@FixedLengthRecord(length = 4, paddingChar = ' ', header = OrderHeader.class, footer = OrderFooter.class)
public class Order {
private @Link OrderHeader header;
private @Link OrderFooter footer;
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
@Override
public String toString() {
// TODO Auto-generated method stub
return orderNr + clientNr + header + footer;
}
public OrderHeader getHeader() {
return header;
}
public void setHeader(OrderHeader header) {
this.header = header;
}
public OrderFooter getFooter() {
return footer;
}
public void setFooter(OrderFooter footer) {
this.footer = footer;
}
public int getOrderNr() {
return orderNr;
}
public void setOrderNr(int orderNr) {
this.orderNr = orderNr;
}
public String getClientNr() {
return clientNr;
}
public void setClientNr(String clientNr) {
this.clientNr = clientNr;
}
}
@FixedLengthRecord
public class OrderFooter {
@DataField(pos = 1, length = 1)
public int recordType ;
@DataField(pos = 2, length = 9)
public String numberOfRecordsInTheFile;
public String toString() {
return recordType + ":" + numberOfRecordsInTheFile;
}
public int getRecordType() {
return recordType;
}
public void setRecordType(int recordType) {
this.recordType = recordType;
}
public String getNumberOfRecordsInTheFile() {
return numberOfRecordsInTheFile;
}
public void setNumberOfRecordsInTheFile(String numberOfRecordsInTheFile) {
this.numberOfRecordsInTheFile = numberOfRecordsInTheFile;
}
}
@FixedLengthRecord
public class OrderHeader {
@DataField(pos = 1, length = 1)
public int recordType = 1;
@DataField(pos = 2, length = 10, pattern = "dd-MM-yyyy")
public Date recordDate;
public String toString() {
return recordType + ":" + new SimpleDateFormat("dd-MM-yyyy").format(recordDate);
}
public int getRecordType() {
return recordType;
}
public void setRecordType(int recordType) {
this.recordType = recordType;
}
public Date getRecordDate() {
return recordDate;
}
public void setRecordDate(Date recordDate) {
this.recordDate = recordDate;
}
}
Dependencies:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-spring-boot</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>2.19.1</version>
</dependency>
<!-- Camel xquery support -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-saxon</artifactId>
<version>2.19.1</version>
</dependency>
<!-- Camel JMS support and ActiveMq -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jms</artifactId>
<version>2.19.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-camel</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ftp</artifactId>
<version>2.19.1</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-bindy</artifactId>
<version>2.19.1</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-stream</artifactId>
<version>2.19.1</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-restlet</artifactId>
<version>2.19.1</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-flatpack</artifactId>
<version>2.19.1</version>
</dependency>
<!-- Hawtio dependency - a lightweight web console to monitor and manage
application -->
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-springboot</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-core</artifactId>
<version>1.5.2</version>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
I had a quick look at the camel bindy component tests and I could not find one that combines @FixedLengthRecord(header,footer ) with @Link
One possible workaround to your issue could be to
Remove @Link from your header and footer fields in Order e.g
@FixedLengthRecord(length = 4, paddingChar = ' ', header = OrderHeader.class, footer = OrderFooter.class)
public class Order {
private OrderHeader header;
private OrderFooter footer;
}
2.Then the header and footer are successfully processed by bindy and added in the exchange as headers("CamelBindyFixedLengthHeader","CamelBindyFixedLengthFooter") so with a processor you can set them to the order header,footer fields afterwards e.g
.unmarshal(bindy).split(body()).process(exchange -> {
Order order = exchange.getIn().getBody(Order.class);
order.setFooter((OrderFooter)exchange.getIn().getHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_FOOTER,Map.class).get(OrderFooter.class.getName()));
order.setHeader((OrderHeader)exchange.getIn().getHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER,Map.class).get(OrderHeader.class.getName()));
});
Related camel unit test here
Make sure your POJOs are public classes. Its not your POJO class that instantiate another class, its camel-bindy / camel-core and that code runs in org.apache.camel
packages, and cannot rely on package visible access to POJOs. So bottom line, keep it public so its standard Java beans.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With