camel jdbc 和 outputClass 选项
camel jdbc and outputClass option
我想从数据库中读取并创建一个 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"/>
这将 return 模型列表。型号 class 是
@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}
据我了解,问题出在模型属性的命名上。 我尝试过的一个解决方案是重命名模型 itemId => itemid。这会起作用,但我没有使用 Java 命名约定。
你知道如何在不重命名属性的情况下解决这个问题吗?
我也尝试了以下方法,但没有用。
@DataField(pos = 3, columnName = "G_Lief. Artikelnummer", name = "itemid")
private String itemId;
我没有发现您的代码结构有任何问题。
如果您想要完成的是从 table 检索并根据您的 Model2
class 将其结果导出到 CSV,我可能建议使用 驼色-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:\n${body}")
.to("mock:result");
}
};
}
您轮询来自 table 的数据,对其进行编组,然后将消息发送到其他队列。我已经 运行 进行了一些测试以确保可以将查询结果转换为 CSV,并且只要您保持字段名称等于您的 属性,似乎就不会出错。 (旁注:在我的测试中,即使没有别名也一切正常)。
但是,在测试你的代码时,我遇到了同样的错误。也许您需要实施 beanRowMapper
:
To use a custom org.apache.camel.component.jdbc.BeanRowMapper when using outputClass. The default implementation will lower case the row names and skip underscores, and dashes. For example "CUST_ID" is mapped as "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
。
我想从数据库中读取并创建一个 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"/>
这将 return 模型列表。型号 class 是
@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}
据我了解,问题出在模型属性的命名上。 我尝试过的一个解决方案是重命名模型 itemId => itemid。这会起作用,但我没有使用 Java 命名约定。
你知道如何在不重命名属性的情况下解决这个问题吗?
我也尝试了以下方法,但没有用。
@DataField(pos = 3, columnName = "G_Lief. Artikelnummer", name = "itemid")
private String itemId;
我没有发现您的代码结构有任何问题。
如果您想要完成的是从 table 检索并根据您的 Model2
class 将其结果导出到 CSV,我可能建议使用 驼色-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:\n${body}")
.to("mock:result");
}
};
}
您轮询来自 table 的数据,对其进行编组,然后将消息发送到其他队列。我已经 运行 进行了一些测试以确保可以将查询结果转换为 CSV,并且只要您保持字段名称等于您的 属性,似乎就不会出错。 (旁注:在我的测试中,即使没有别名也一切正常)。
但是,在测试你的代码时,我遇到了同样的错误。也许您需要实施 beanRowMapper
:
To use a custom org.apache.camel.component.jdbc.BeanRowMapper when using outputClass. The default implementation will lower case the row names and skip underscores, and dashes. For example "CUST_ID" is mapped as "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
。