camel jdbc和outputClass选项
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了camel jdbc和outputClass选项相关的知识,希望对你有一定的参考价值。
我想从DB读取并创建一个CSV文件。为了做到这一点,我使用camel-jdbc和camel-bindy。
首先,我使用SELECT语句设置主体。
SELECT [vendor],
[ean],
[itemid] AS itemId,
[quantity]
FROM [dbo].[ElectronicDeliveryNotes]
然后我调用jdbc组件
<to uri="jdbc:dataSource?outputType=SelectList&outputClass=com.xxx.Model"/>
这将返回一个模型列表。模型类是
@CsvRecord(separator = ";", generateHeaderColumns = true, crlf = "UNIX")
public class Model2 {
@DataField(pos = 1, columnName = "A_Liererant")
private String vendor;
@DataField(pos = 2, columnName = "F_EAN")
private String ean;
@DataField(pos = 3, columnName = "G_Lief. Artikelnummer")
private String itemId;
@DataField(pos = 4, columnName = "H_Menge")
private BigDecimal quantity;
//getters setters
我收到以下错误:
java.lang.IllegalArgumentException: Cannot map all properties to bean of type class com.xxx.Model2. There are 1 unmapped properties. {itemid=11.0441-5402.2}
根据我的理解,问题在于模型属性的命名。我尝试和工作的一个解决方案是重命名Model itemId => itemid。这将工作,但我不使用Java命名约定。
你知道如何在不重命名属性的情况下克服这个问题吗?
我也试过以下但是没有用。
@DataField(pos = 3, columnName = "G_Lief. Artikelnummer", name = "itemid")
private String itemId;
我没有看到你的代码结构有什么问题。
如果您想要完成的是从表中检索并根据您的Model2
类将其结果导出为CSV,我可能会建议使用camel-sql。可能是这样的:
@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
getContext().getComponent("sql", SqlComponent.class).setDataSource(db);
BindyCsvDataFormat camelDataFormat = new BindyCsvDataFormat(Model2.class);
from("sql:select vendor, ean, itemid as itemId, quantity from ElectronicDeliveryNotes?outputType=SelectList&outputClass=com....model.Model2")
.marshal(camelDataFormat)
.log("the body:
${body}")
.to("mock:result");
}
};
}
您从表中轮询数据,对其进行编组,然后将消息发送到其他队列。我已经运行了一些测试,以确保查询结果可以转换为CSV,只要您保持字段的名称等于您的属性,似乎没有任何错误。 (旁注:在我的测试中,即使没有别名,一切都很顺利)。
但是,测试你的代码,我也犯了同样的错误。也许你需要实现beanRowMapper
:
使用outputClass时使用自定义org.apache.camel.component.jdbc.BeanRowMapper。默认实现将小写行名称并跳过下划线和破折号。例如,“CUST_ID”被映射为“custId”。
我猜这就是你陷入这个错误的原因:
java.lang.IllegalArgumentException: Cannot map all properties to bean of type class com.xxx.Model2. There are 1 unmapped properties. {itemid=11.0441-5402.2}
尝试将别名重命名为ITEM_ID
。
以上是关于camel jdbc和outputClass选项的主要内容,如果未能解决你的问题,请参考以下文章
Camel JDBC StreamList 查询似乎在拆分之前加载了整个结果集