gpt4 book ai didi

apache-camel - 如何使用 Camel Bindy 生成带有页眉和页脚的平面文件

转载 作者:行者123 更新时间:2023-12-05 06:42:58 27 4
gpt4 key购买 nike

目前我可以使用 camel Bindy 从 POJO 生成平面文件,但无法将页眉和页脚添加到完整文件。

但是当我尝试向文件添加页眉/页脚时,它会添加到每条记录,但我需要将单个页眉/页脚添加到整个文件而不是文件中的每条记录。

下面是代码片段:

from("jpa:com.PACKAGENAME.RebatePayout?consumer.namedQuery=REBATE_PAYOUT&consumer.delay=500000&consumeLockEntity=true&consumeDelete=false")
.routeId("rebateroute")
.process(new Processor() {
RebateOutputgenerator rop = new RebateOutputgenerator();
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody(rop.processEntities((RebatePayout) exchange.getIn().getBody()));
log.info("the exchange value is ", exchange);
}
})
.process(new FahHeaderAndFooterHelper())
.log("Fixed length format marshal....")
.marshal(fixedLegth)
.log("Fixed length format data....${body}")
.to("file://C:/Users/vvakalap/Desktop/example/New folder?fileExist=Append&fileName=output.txt")
.log("Data Saved in file...");

进程类是

public class FahHeaderAndFooterHelper implements Processor{
@Override
public void process(Exchange exchange) throws Exception {
Map<String, Object> headerObjMap = new HashMap<String,Object>();
headerObjMap.put(FahRecordHeader.class.getName(), new FahRecordHeader());
if(exchange.getOut().getBody() == "null")
exchange.getOut().setHeader(CAMEL_BINDY_FIXED_LENGTH_HEADER, headerObjMap);
Map<String, Object> footerObjMap = new HashMap<String,Object>();
footerObjMap.put(FahRecordFooter.class.getName(), new FahRecordFooter());
exchange.getOut().setHeader(CAMEL_BINDY_FIXED_LENGTH_FOOTER, footerObjMap);
exchange.getOut().setBody(exchange.getIn().getBody());
}

POJO 类

@Data
@Section(number=2)
@FixedLengthRecord(header = FahRecordHeader.class, footer = FahRecordFooter.class)
public class RebateFinalRecord implements Serializable {

private static final long serialVersionUID = 7375828620208233805L;

@DataField(pos = 1, length = 3)
private String transactionRecordIdentifier;

@DataField(pos = 4, length = 10)
private String transactionNumber;

@DataField(pos = 14, length = 5)
private String transactionLineNumber;

@DataField(pos = 19, length = 20)
private String transactionDistributionType;

@DataField(pos = 39, length = 30)
private String eventTypeName;

@DataField(pos = 69, length = 8)
private String transactionDate;

@DataField(pos = 77, length = 8)
private String transactionEffectiveDate;

@DataField(pos = 85, length = 5)
private String transactingEntityValue;

@DataField(pos = 90, length = 1)
private String reciprocationFlag;

}

绑定(bind)类

@Data
public class FahRecordHeader {
@DataField(pos = 1, length = 3)
private String fileRecordIdentifier = "000";
@DataField(pos = 4, length = 15)
private String controlIdentifierOrSequenceNumber = "LSCD00000000006";
@DataField(pos = 19, length = 20)
private String source = "LSCD";
}

@Data
public class FahRecordFooter {

@DataField(pos = 1, length = 70)
private String footer = "footervalusforfahrecord for cashrebates";
/*
* @DataField(pos = 2, length = 9, align = "R", paddingChar = &#39;0&#39;)
* private int numberOfRecordsInTheFile;
*/
}

最佳答案

创建一个辅助方法,它返回您的 MyClass 的所有已声明字段:

import java.lang.reflect.Field

class AnnotationUtil {

public static Field[] getDeclaredFields(Class clazz, boolean recursively) {
List<Field> fields = new LinkedList<Field>();
Field[] declaredFields = clazz.getDeclaredFields();
Collections.addAll(fields, declaredFields);

Class superClass = clazz.getSuperclass();

if(superClass != null && recursively) {
Field[] declaredFieldsOfSuper = getDeclaredFields(superClass, recursively);
if(declaredFieldsOfSuper.length > 0)
Collections.addAll(fields, declaredFieldsOfSuper);
}

return fields.toArray(new Field[fields.size()]);
}
}
@CsvRecord(separator = "|",  generateHeaderColumns = false)
class MyClass {

@DataField(pos = 1, columnName = "Column1")
String orderName;

@DataField (pos = 2, columnName = "Column2")
String transactionId
}

然后创建一个处理器:

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.dataformat.bindy.annotation.DataField;
import org.springframework.stereotype.Component;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Collectors;

@Component
class CSVHeaderProcessor implements Processor{
@Override
public void process(Exchange exchange) throws Exception {
String fullFilePath = (String) exchange.getIn().getHeader("CSV_FILE_LOCATION");
String header;
File csvFile = new File(fullFilePath);

if(!csvFile.exists()) {
String headerRow = Arrays.stream((AnnotationUtil.getDeclaredFields(YourClass.class, false))).map(x -> x.getAnnotation(DataField.class).columnName()).collect( Collectors.joining( "," ));
Files.write(Paths.get(csvFile.getPath()), headerRow.getBytes());
}

}
}

然后在你的 route 使用它:

 from("direct:handleCSV")
.setHeader("CSV_FILE_LOCATION", simple("/tmp/yourfile.csv"))
.process(csvHeaderProcessor)
.marshal(bindy)
.to("file:///tmp?fileName=yourfile.csv&fileExist=append")

关于apache-camel - 如何使用 Camel Bindy 生成带有页眉和页脚的平面文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35183977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com