微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Apache Camel从另一个API消耗JSON并以CSV格式

如何解决使用Apache Camel从另一个API消耗JSON并以CSV格式

我是新来的阿帕奇骆驼。我想从另一个api的终点URL(http:// localhost:8080 / employeePayload)使用json数据。我想使用此json数据,使用Apache骆驼将其解组到POJO并将其写入CSV文件。在以CSV格式编写之前,我需要为每个属性/列添加定界符|“。 另外,我还必须将标题和尾部记录添加到CSV文件中。标头包含一些静态列名称和一些运行时名称。标头列数将与json数据不同。标头有15列,而json有110列)。

有没有一种方法可以不使用setter方法将json / pojo绑定到CSV文件(因为我有110个属性,不能全部使用setter)?

有人可以建议实现此目标的最佳方法是什么吗?

如果标题部分不清楚,请告诉我如何使用delimiter(|“)将json写入CSV。

编辑:我能够使用其他API的json。但是我不确定如何在不使用getter和setter的情况下使用apache camel或任何其他lib用定界符在CSV中编写它。

解决方法

我找到了答案。 随着开发的进展,我遇到了很多问题,这些问题已在stackoverflow中发布。

我决定总结发现的一切。

请参阅以下帖子。 Unable to add header and footer to the file using Apache Camel Bindy

此解决方案解决了我在各个阶段遇到的许多问题。

问题1)使用BindyFixedLengthDataFormat将动态页眉和页脚添加到平面文件中。顾名思义,它是固定长度。生成主体后,我必须分配最大长度并修剪空白。 (我仍然可能需要考虑使用其他类,因为我不想固定长度)。 BindyCsvDataFormat不能选择向文件添加动态页眉和页脚。

问题2)我需要用|“替换管道定界符。

问题3)我使用了rest配置,以便不再使用硬编码来主机名,并且可以将其部署到任何环境,而不是使用jetty公开将进行硬编码的端点url。

@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,trim = true)
    public String CLIID;
    
    @DataField(pos = 3,trim = true)
    public String INTCA;
    
    @DataField(pos = 4,trim = true)
    public String ORDNO;
    
    @DataField(pos = 5,trim = true)
    public String IOPER;
    
    @DataField(pos = 6,trim = true)
    public String INFTY;
    
    @DataField(pos = 7,trim = true)
    public String SUBTY;
    
    @DataField(pos = 8,trim = true)
    public String BEGDA;
    
    @DataField(pos = 9,trim = true)
    public String ENDDA;
    
    @DataField(pos = 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,trim = true)
    private String header1;
    
    @DataField(pos = 2,trim = true)
    private String header2;
    
    @DataField(pos = 3,length = 15,trim = true)
    private String header3;
    
    @DataField(pos = 4,length = 60,trim = true)
    private String header4;
    
    @DataField(pos = 5,trim = true)
    private String header5;
    
    @DataField(pos = 6,length = 30,trim = true)
    private String header6;
    
    @DataField(pos = 7,trim = true)
    private String header7;
    
    @DataField(pos = 8,length =  8,pattern = "YYYYMMDD",trim = true)
    private String header8;
    
    @DataField(pos = 9,length = 6,trim = true)
    private String header9;
    
    @DataField(pos = 10,length = 1,trim = true)
    private String header10;
    
    @DataField(pos = 11,length = 2,trim = true)
    private String header11;
    
    @DataField(pos = 12,trim = true)
    private String header12;
    
    @DataField(pos = 13,trim = true)
    private String header13;
    
    @DataField(pos = 14,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,trim = true)
    private String trailer;
    
    @DataField(pos = 2,trim = true)
    private int count;
    
    public Footer() {
        
    }
    
    public Footer(String trailer,int count) {
        this.trailer = trailer;
        this.count = count;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。