Верблюд JDBC и опция выходного класса

Я хочу читать из БД и создать файл CSV. Для этого я использую camel-jdbc и camel-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}

Насколько я понимаю, проблема заключается в именовании свойств модели. Одно из решений, которое я пробовал и работало, - переименовать Model itemId => itemid. Это будет работать, но я не использую соглашения об именах Java.

Знаете ли вы, как преодолеть это без переименования свойств?

Я также попробовал следующее, но это не сработало.

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

1 ответ

Решение

Я не видел ничего плохого в вашей структуре кода.

Если вы хотите получить из таблицы и экспортировать результаты в CSV на основе вашего Model2 класс, я могу предложить использовать 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:

Использовать пользовательский org.apache.camel.component.jdbc.BeanRowMapper при использовании outputClass. Реализация по умолчанию будет в нижнем регистре имен строк и пропустить подчеркивания и тире. Например, "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,

Другие вопросы по тегам