Java 无法使用Apache Camel Bindy将页眉和页脚添加到文件中

Java 无法使用Apache Camel Bindy将页眉和页脚添加到文件中,java,spring-boot,apache-camel,apache-commons,bindy,Java,Spring Boot,Apache Camel,Apache Commons,Bindy,我试图创建一个以页眉和页脚记录以及json负载为主体的文件。 页眉和页脚属性值将根据时间戳和记录总数进行动态设置 (目前,我计划通过属性的静态值来实现)。 我使用FixedLengthDataFormat来实现这一点。 但是,没有将页眉和页脚记录添加到文件中,该文件只有json有效负载作为正文。 有人能帮我做到这一点吗 我已经复制了下面所有的类文件 @Component public class EmployeePackageRoute extends RouteBuilder { @

我试图创建一个以页眉和页脚记录以及json负载为主体的文件。 页眉和页脚属性值将根据时间戳和记录总数进行动态设置 (目前,我计划通过属性的静态值来实现)。 我使用FixedLengthDataFormat来实现这一点。 但是,没有将页眉和页脚记录添加到文件中,该文件只有json有效负载作为正文。 有人能帮我做到这一点吗

我已经复制了下面所有的类文件

@Component
public class EmployeePackageRoute extends RouteBuilder {

    @Autowired
    private Header header;
    
    private Trailer footer;
    
    @SuppressWarnings("deprecation")
    @Override
    public final void configure() {
        System.out.println("fetching employee details from employee api");
        try {
            
            from("jetty://http://localhost:8084/employee-package/getEmployee")
            .unmarshal().json(JsonLibrary.Jackson, RecurringPaymentResults.class)
            .process(
                    ex -> {
                        System.out.println("+++++++++++++++++ "+ex.getIn().getBody());
                        RecurringPaymentResults result = ex.getIn().getBody(RecurringPaymentResults.class);
                        List<RecurringPaymentsDeduct> employee = result.getResults();
                        ex.getOut().setBody(employee);
                        System.out.println("**** Header ** "+header);
                    })
            .to("seda:employeeFeed");
            
            final DataFormat bindy = new BindyFixedLengthDataFormat(RecurringPaymentsDeduct.class);
            
            footer = new Trailer("TRAILER",3);
            
            Map<String, Object> headerObjMap = new HashMap<String,Object>();
            headerObjMap.put(Header.class.getName(), header);
            
            Map<String, Object> footerObjMap = new HashMap<String,Object>();
            footerObjMap.put(Trailer.class.getName(), footer);
            
            from("seda:employeeFeed")
            .log("process csv")
            .marshal(bindy)
            .log("csv processed")
            .process(
                    ex -> {
                        System.out.println("******************** "+ex.getIn().getBody());
                        
                        //ex.getOut().setHeader("header", header);
                        ex.getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER, headerObjMap);
                        ex.getOut().setBody(ex.getIn().getBody());
                        ex.getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_FOOTER, footerObjMap);
                        
                    }).to("file://C:\Users\testfolder?fileName=test.txt")
            .end();
            
                        
        } catch(Exception e) {
            System.out.println("Error occurred while processing employee data: "+e.getMessage());
            e.printStackTrace();
        }
    }
}

    @Data
    @Section(number = 2)
    @FixedLengthRecord(header = Header.class, footer = Trailer.class)
    public class RecurringPaymentsDeduct implements Serializable {
    
        private static final long serialVersionUID = 1L;
        
        @DataField(pos = 1, length = 10)
        public String RECTY;
        
        @DataField(pos = 2, length = 10)
        public String CLIID;
        
        @DataField(pos = 3, length = 10)
        public String INTCA;
        
        @DataField(pos = 4, length = 10)
        public String ORDNO;
        
        @DataField(pos = 5, length = 10)
        public String IOPER;
        
        @DataField(pos = 6, length = 10)
        public String INFTY;
        
        @DataField(pos = 7, length = 10)
        public String SUBTY;
        
        @DataField(pos = 8, length = 10)
        public String BEGDA;
        
        @DataField(pos = 9, length = 10)
        public String ENDDA;
        
        @DataField(pos = 10, length = 10)
        public String OBJPS;
        
    }


@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("test")
@Data
@Section(number = 1)
@FixedLengthRecord()
public class Header implements Serializable {

    private static final long serialVersionUID = 1L;

    @DataField(pos = 1, length = 5)
    private String header1;
    
    @DataField(pos = 2, length = 5)
    private String header2;
    
    @DataField(pos = 3, length = 15)
    private String header3;
    
    @DataField(pos = 4, length = 60)
    private String header4;
    
    @DataField(pos = 5, length = 15)
    private String header5;
    
    @DataField(pos = 6, length = 30)
    private String header6;
    
    @DataField(pos = 7, length = 30)
    private String header7;
    
    @DataField(pos = 8, length =  8, pattern = "YYYYMMDD")
    private String header8;
    
    @DataField(pos = 9, length = 6)
    private String header9;
    
    @DataField(pos = 10, length = 1)
    private String header10;
    
    @DataField(pos = 11, length = 2)
    private String header11;
    
    @DataField(pos = 12, length = 10)
    private String header12;
    
    @DataField(pos = 13, length = 10)
    private String header13;
    
    @DataField(pos = 14, length = 10)
    private String header14;
}


@Section(number = 3)
@FixedLengthRecord
public class Trailer implements Serializable {

    private static final long serialVersionUID = 1L;

    @DataField(pos = 1, length = 7)
    private String trailer;
    
    @DataField(pos = 2, length = 2)
    private int count;
    
    public String getTrailer() {
        return trailer;
    }
    public void setTrailer(String trailer) {
        this.trailer = trailer;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
}
@组件
公共类EmployeePackageRoute扩展了RouteBuilder{
@自动连线
私有报头;
私人拖车尾;
@抑制警告(“弃用”)
@凌驾
公共最终无效配置(){
System.out.println(“从员工api获取员工详细信息”);
试一试{
从(”jetty://http://localhost:8084/employee-套餐/员工套餐)
.unmarshal().json(JsonLibrary.Jackson,RecurringPaymentResults.class)
.过程(
ex->{
System.out.println(“+;
RecurringPaymentResults=ex.getIn().getBody(RecurringPaymentResults.class);
List employee=result.getResults();
例如getOut().setBody(员工);
System.out.println(“****表头**”+表头);
})
。至(“seda:employeeFeed”);
final DataFormat bindy=新的BindyFixedLengthDataFormat(RecurringPaymentsDeduct.class);
页脚=新拖车(“拖车”,3);
Map headerObjMap=新建HashMap();
headerObjMap.put(Header.class.getName(),Header);
Map footerObjMap=新HashMap();
footerObjMap.put(traile.class.getName(),footer);
来自(“seda:employeeFeed”)
.log(“处理csv”)
元帅(宾迪)
.log(“已处理csv”)
.过程(
ex->{
System.out.println(“****************”+ex.getIn().getBody());
//例如getOut().setHeader(“header”,header);
例如,getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER,headerObjMap);
例如getOut().setBody(例如getIn().getBody());
例如,getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_FOOTER,footerObjMap);
}).to(“file://C:\Users\testfolder?fileName=test.txt”)
.end();
}捕获(例外e){
System.out.println(“处理员工数据时出错:+e.getMessage());
e、 printStackTrace();
}
}
}
@资料
@区段(编号=2)
@FixedLengthRecord(页眉=header.class,页脚=Trailer.class)
公共类RecurringPaymentsDevice实现可序列化{
私有静态最终长serialVersionUID=1L;
@数据字段(位置=1,长度=10)
公共字符串查询;
@数据字段(位置=2,长度=10)
公共字符串CLIID;
@数据字段(位置=3,长度=10)
公共字符串INTCA;
@数据字段(位置=4,长度=10)
公共字符串ORDNO;
@数据字段(位置=5,长度=10)
公共字符串IOPER;
@数据字段(位置=6,长度=10)
公共字符串输入;
@数据字段(位置=7,长度=10)
公共字符串微妙;
@数据字段(位置=8,长度=10)
公共字符串BEGDA;
@数据字段(位置=9,长度=10)
公共字符串ENDDA;
@数据字段(位置=10,长度=10)
公共字符串OBJPS;
}
@配置
@EnableConfigurationProperties
@配置属性(“测试”)
@资料
@区段(编号=1)
@固定长度记录()
公共类标头实现可序列化{
私有静态最终长serialVersionUID=1L;
@数据字段(位置=1,长度=5)
私用线头1;
@数据字段(位置=2,长度=5)
私人线头2;
@数据字段(位置=3,长度=15)
私人线头3;
@数据字段(位置=4,长度=60)
私有字符串头4;
@数据字段(位置=5,长度=15)
私人线头5;
@数据字段(位置=6,长度=30)
私人线头6;
@数据字段(位置=7,长度=30)
私人线头7;
@数据字段(pos=8,length=8,pattern=“yyyyymmdd”)
私用线头8;
@数据字段(位置=9,长度=6)
私用线头9;
@数据字段(位置=10,长度=1)
私人线头10;
@数据字段(位置=11,长度=2)
私人线头11;
@数据字段(位置=12,长度=10)
私人线头12;
@数据字段(位置=13,长度=10)
私人线头13;
@数据字段(位置=14,长度=10)
私人线头14;
}
@区段(编号=3)
@固定长度记录
公共类拖车实现可序列化{
私有静态最终长serialVersionUID=1L;
@数据字段(位置=1,长度=7)
私家拖车;
@数据字段(位置=2,长度=2)
私人整数计数;
公共字符串getTrailer(){
返回拖车;
}
公共拖车(字符串拖车){
this.trail=拖车;
}
public int getCount(){
返回计数;
}
公共无效集合计数(整数计数){
this.count=计数;
}
}
我找到了答案。 这个解决方案解决了我在不同阶段遇到的许多问题

问题1)在平面文件中添加了动态页眉和页脚
    @Component
    public class EmployeePackageRoute extends RouteBuilder {
    
        @Autowired
        private Header header;
        
        private Trailer footer;
        
        private String file_name;
        
        @SuppressWarnings("deprecation")
        @Override
        public final void configure() {
            
            System.out.println("fetching employee details from employee api");
            
            final SimpleDateFormat TARGET_DATE_FORMAT = new SimpleDateFormat("YYYYMMDDHHMMSS");
            String date = TARGET_DATE_FORMAT.format(new Date());
            
            String year = date.substring(0, 8);
            String hr = date.substring(9, 13);
    
            try {
                restConfiguration().component("jetty").port(8000).bindingMode(RestBindingMode.json);
                rest("/api/test/getTestResponse")
                .get().consumes(MediaType.APPLICATION_JSON_VALUE).route().setBody().constant("return test response");
                
                rest("/api/bcr/recurringPaymentsDeduct")
                .post().consumes(MediaType.APPLICATION_JSON_VALUE).type(RecurringPaymentResults.class).outType(ResponseEntity.class).route()
                .process(
                        ex -> {
                            
                            RecurringPaymentResults result = ex.getIn().getBody(RecurringPaymentResults.class);
                            List<RecurringPaymentsDeduct> employee = result.getResults();
                            file_name = Constants.FILE_NUMBER_DEV+"_"+date+"_"+Constants.AUMBCR_HRMD+result.getSequenceNumber()+"_"+Constants.DUT8G2I+".SAP";
                            header.setHeader7(Constants.FILE_NUMBER_DEV+"_"+date+"_"+Constants.AUMBCR_HRMD+result.getSequenceNumber()+"_"+Constants.DUT8G2I+".SAP");
                            
                            header.setHeader8(year);
                            header.setHeader9(hr);
                            header.setHeader10(Constants.ENVIRONMENT);
                            
                            footer = new Footer("Footer",(employee.size()+2));
                            
                            ex.getOut().setBody(employee);
                        })
                .to("seda:recurringPaymentsFeed");
                
                final DataFormat recurringPaymentsBindy = new BindyFixedLengthDataFormat(RecurringPaymentsDeduct.class);
                
                from("seda:recurringPaymentsFeed")
                .startupOrder(2)
                .log("add footer to the file")
                .process(
                        ex -> {
                            
                            Map<String, Object> headerObjMap = new HashMap<String,Object>();
                            headerObjMap.put(Header.class.getName(), header);
                            System.out.println(" *** file_name 1 - "+file_name);
                            Map<String, Object> footerObjMap = new HashMap<String,Object>();
                            footerObjMap.put(Footer.class.getName(), footer);
                            
                            ex.getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER, headerObjMap);
                            ex.getOut().setBody(ex.getIn().getBody());
                            ex.getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_FOOTER, footerObjMap);
                            
                        })
                .marshal(recurringPaymentsBindy)
                .convertBodyTo(byte[].class, "iso-8859-1")
                .setBody(body().regexReplaceAll("\\|", "\\|\""))
                .log("csv processed")
                .to("file://app/bcr-files?fileName=recurringPaymentsDeduct.SAP")
                .end();
                
                
            } catch(Exception e) {
                System.out.println("Error occurred while processing employee data: "+e.getMessage());
                e.printStackTrace();
            }
        }
        
    }

@Data
@Section(number = 2)
@FixedLengthRecord(header = Header.class, footer = Trailer.class)
public class RecurringPaymentsDeduct implements Serializable {

    private static final long serialVersionUID = 1L;
    
    @DataField(pos = 1, length = 10, delimiter = "|", trim = true)
    public String RECTY;
    
    @DataField(pos = 2, length = 10, delimiter = "|", trim = true)
    public String CLIID;
    
    @DataField(pos = 3, length = 10, delimiter = "|", trim = true)
    public String INTCA;
    
    @DataField(pos = 4, length = 10, delimiter = "|", trim = true)
    public String ORDNO;
    
    @DataField(pos = 5, length = 10, delimiter = "|", trim = true)
    public String IOPER;
    
    @DataField(pos = 6, length = 10, delimiter = "|", trim = true)
    public String INFTY;
    
    @DataField(pos = 7, length = 10, delimiter = "|", trim = true)
    public String SUBTY;
    
    @DataField(pos = 8, length = 10, delimiter = "|", trim = true)
    public String BEGDA;
    
    @DataField(pos = 9, length = 10, delimiter = "|", trim = true)
    public String ENDDA;
    
    @DataField(pos = 10, length = 10, trim = true)
    public String OBJPS;
        
}

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("adp")
@Data
@Section(number = 1)
@FixedLengthRecord()
public class Header implements Serializable {

    private static final long serialVersionUID = 1L;

    @DataField(pos = 1, length = 5, delimiter = "|", trim = true)
    private String header1;
    
    @DataField(pos = 2, length = 5, delimiter = "|", trim = true)
    private String header2;
    
    @DataField(pos = 3, length = 15, delimiter = "|", trim = true)
    private String header3;
    
    @DataField(pos = 4, length = 60, delimiter = "|", trim = true)
    private String header4;
    
    @DataField(pos = 5, length = 15, delimiter = "|", trim = true)
    private String header5;
    
    @DataField(pos = 6, length = 30, delimiter = "|", trim = true)
    private String header6;
    
    @DataField(pos = 7, length = 30, delimiter = "|", trim = true)
    private String header7;
    
    @DataField(pos = 8, length =  8, pattern = "YYYYMMDD", delimiter = "|", trim = true)
    private String header8;
    
    @DataField(pos = 9, length = 6, delimiter = "|", trim = true)
    private String header9;
    
    @DataField(pos = 10, length = 1, delimiter = "|", trim = true)
    private String header10;
    
    @DataField(pos = 11, length = 2, delimiter = "|", trim = true)
    private String header11;
    
    @DataField(pos = 12, length = 10, delimiter = "|", trim = true)
    private String header12;
    
    @DataField(pos = 13, length = 10, delimiter = "|", trim = true)
    private String header13;
    
    @DataField(pos = 14, length = 10, align = "L", trim = true)
    private String header14;
}

@Data
@Section(number = 3)
@FixedLengthRecord()
public class Footer implements Serializable {

    private static final long serialVersionUID = 1L;

    @DataField(pos = 1, length = 7, delimiter = "|", trim = true)
    private String trailer;
    
    @DataField(pos = 2, length = 5, align = "L", trim = true)
    private int count;
    
    public Footer() {
        
    }
    
    public Footer(String trailer, int count) {
        this.trailer = trailer;
        this.count = count;
    }
}