如何在 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;
}
}
我有一个自定义 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;
}
}