【问题标题】:camel jdbc and outputClass option骆驼 jdbc 和 outputClass 选项
【发布时间】:2017-12-19 11:26:36
【问题描述】:

我想从数据库中读取数据并创建一个 CSV 文件。为此,我使用 camel-jdbccamel-bindy

首先我使用 SELECT 语句设置正文。

SELECT  [vendor],
        [ean],
        [itemid] AS itemId,
        [quantity]
FROM [dbo].[ElectronicDeliveryNotes]

然后我调用jdbc组件

<to uri="jdbc:dataSource?outputType=SelectList&amp;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}

据我了解,问题在于模型属性的命名。 我尝试过的一个解决方案是重命名模型 itemId => itemid。这会起作用,但我没有使用 Java 命名约定。

你知道如何在不重命名属性的情况下克服这个问题吗?

我也尝试了以下方法,但没有成功。

 @DataField(pos = 3, columnName = "G_Lief. Artikelnummer", name = "itemid")
    private String itemId;

【问题讨论】:

  • 我想弄清楚你想要做什么。您是否尝试从表中读取并将其结果导出到 CSV 文件?当执行路由时,您会在上面收到此错误吗?我的理解正确吗?如果是这样,我可以建议另一种方法吗?
  • 是的,我正在尝试从 db 读取记录并创建一个 csv 文件。执行 jdbc 时发生错误。如描述中所述,它无法映射属性 itemId,因此在模型类中重命名为 itemid 是一种可能的解决方案,但我想问是否有办法使用 java没有重命名属性的命名约定。你有什么想法吗?
  • 你可以使用camel-sql。看看我的回答。稍后我会看一下camel-jdbc 替代方案,以便更接近您的问题。

标签: apache-camel bindy camel-jdbc


【解决方案1】:

我没有发现您的代码结构有任何问题。

如果您想要完成的是从表中检索并将其结果导出到基于您的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:\n${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

【讨论】:

  • 非常感谢! beanRowMapper 是 jdbc 组件中的一个选项,所以我必须提供一个自定义实现,或者如你所说的别名 collumn 到 ITEM_ID,或者只是命名 java 类属性 itemid。
  • 是的!但如果您接受建议,我认为只有将您的别名重命名为 ITEM_ID 可能更可靠。
  • 是的,有3个选项,别名的方法就是你说的更可靠!再次感谢
猜你喜欢
  • 2023-04-02
  • 2015-05-05
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多