如何在 Apache camel 中将自定义 class 设置为等价交换?

How to set custom class to equal exchange in Apache camel?

我有一个自定义 class 我正在尝试设置为传入交换消息。但是当我尝试设置它时,我总是收到这个错误。

java.lang.ClassCastException: java.lang.String cannot be cast to com.models.CsvModel

我的路线如下

private final DataFormat bindy = new BindyCsvDataFormat(com.models.CsvModel.class); 

 @Override
  public void configure() throws Exception {
    from("{{input.files.csv}}")
            .routeId("CSVConverter")
            .split(body().tokenize("\n"))
            .unmarshal(bindy)
            .split(body().tokenize(","))
            .process(new CsvConverterProcessor())
            .to("{{output.files.csv}}");
  }

我的习惯class是这样的

@Component
@CsvRecord(separator = " ")
public class CsvModel {
 //some fields with setters, getters, and 2 constructors
//fields are annotated with @Datafield and pos
}

我尝试在我的处理器处理方法中这样设置它 CsvModel model = (CsvModel) exchange.getIn().getBody();

我看过一个例子,他们就是这样做的,而且对他们很有效。

您似乎从未真正将交换主体转换为 CsvModel。为此,您需要在处理器接收交换之前调用 .convertBodyTo()。

.split(body().tokenize(","))
.convertBodyTo(CsvModel.class)
.process(new CsvConverterProcessor())

Camel 也不知道如何转换交换体 to/from 您的 class,因此您需要添加自定义类型转换器,使用注释或通过扩展 TypeConverter class。这是您需要的示例框架。我还会包括一个转换器以另一种方式(CsvModel -> String)。您可以在此处找到类型转换器的完整文档:https://camel.apache.org/manual/type-converter.html

@Converter(generateBulkLoader = true)
public class CsvModelConverter {

  @Converter
  public static CsvModelConverter toCsvModel(String data, Exchange exchange) {
     CsvModel newModel = //Whatever you need to do to convert the string data to your class
     return csvModel;
  }
}