Apache Camel sql-component Не удалось преобразовать во внутреннее представление

Когда я использую sql-compenent извлекать записи из базы данных как Map<String,Object> все в порядке.

<to uri="sql-clsivtrk:{{clsiv_tracker_config_se}}?outputType=SelectOne" />

Но когда я определяю outputClass как это:

<to uri="sql-clsivtrk:{{clsiv_tracker_config_se}}?outputType=SelectOne&amp;outputClass=br.com.rwit.clsi.m2m.rs.model.TrackerConfig" />

Я получил ошибку java.sql.SQLException: Fail to convert to internal representation

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[route9            ] [route9            ] [servlet:/events/config?httpMethodRestrict=PUT                                 ] [        93]
[route9            ] [to39              ] [direct:save-config                                                            ] [         0]
[tracker-configurat] [convertBodyTo4    ] [convertBodyTo[java.lang.String]                                               ] [         0]
[tracker-configurat] [unmarshal4        ] [unmarshal[ref:trackerConfigJsonList]                                          ] [         2]
[tracker-configurat] [log4              ] [log                                                                           ] [         1]
[tracker-configurat] [split3            ] [split[simple{${body}}]                                                        ] [         6]
[tracker-configurat] [to6               ] [sql-tracker:{{tracker_config_se}}?outputType=SelectOne&outputClass=br.com.acme] [        83]
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException; SQL state [99999]; error code [17059]; Fail to convert to internal representation; nested exception is java.sql.SQLException: Fail to convert to internal representation
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1402)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:620)
    at org.apache.camel.component.sql.SqlProducer.process(SqlProducer.java:116)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)
Caused by: java.sql.SQLException: Fail to convert to internal representation
    at oracle.jdbc.driver.CharCommonAccessor.getBoolean(CharCommonAccessor.java:185)
    at oracle.jdbc.driver.T4CVarcharAccessor.getBoolean(T4CVarcharAccessor.java:794)
    at oracle.jdbc.driver.OracleResultSetImpl.getBoolean(OracleResultSetImpl.java:640)
    at com.sun.gjc.spi.base.ResultSetWrapper.getBoolean(ResultSetWrapper.java:169)
    at org.springframework.jdbc.support.JdbcUtils.getResultSetValue(JdbcUtils.java:148)
    at org.springframework.jdbc.core.BeanPropertyRowMapper.getColumnValue(BeanPropertyRowMapper.java:377)
    at org.springframework.jdbc.core.BeanPropertyRowMapper.mapRow(BeanPropertyRowMapper.java:298)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)
    at org.apache.camel.component.sql.DefaultSqlEndpoint.queryForObject(DefaultSqlEndpoint.java:488)
    at org.apache.camel.component.sql]]

мой outputType

import java.util.Calendar;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;


import java.util.Calendar;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;

public class TrackerConfig
{
    private static final String HOST1                   = "http://locahost/";
    private static final String HOST2                   = "http://localhost/";
    private static final String CONTEXT                 = "my-ctx/";
    private static final String API                     = "api/";

    private static final int    DEFAULT_INTERVAL_TRANSM = 60;
    private static final int    DEFAUL_INTERVAL_CAPT    = 30;
    private static final int    DEFAUL_BATCHSIZE        = 100;
    private static final int    DEFAUL_RENEW_CONF       = 3600;

    private String              deviceImei1;
    private String              deviceImei2;
    private String              phoneNumber;
    private String              deviceSO;
    private String              deviceModel;
    private String              deviceSNumber;
    private String              myIp;

    private String              host1;
    private String              host2;
    private String              context;
    private String              api;

    private Number              intervalOftransmission;
    private Number              intervalOfCapture;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    private Date                captureBegin;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    private Date                captureFinal;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    private Date                transmissionBegin;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    private Date                transmissionFinal;
    private Double              minDistance;
    private Double              maxDistance;
    private Number              intervalOfRenewConfig;
    private String              levelConfig;

    private String              deprecated;
    private String              route;
    private String              version;
    private Double              accuracy;
    private Number              batchSize;

    public TrackerConfig()
    {
        this.intervalOftransmission = DEFAULT_INTERVAL_TRANSM;
        this.intervalOfCapture = DEFAUL_INTERVAL_CAPT;
        this.batchSize = DEFAUL_BATCHSIZE;
        this.intervalOfRenewConfig = DEFAUL_RENEW_CONF;
        this.captureBegin = newTime(7, 0, 0);
        this.captureFinal = newTime(18, 0, 0);
        this.transmissionBegin = newTime(4, 6, 0);
        this.transmissionFinal = newTime(23, 59, 59);
        this.minDistance = 10D;
        this.maxDistance = 10001D;
        this.host1 = HOST1;
        this.host2 = HOST2;
        this.context = CONTEXT;
        this.api = API;
        this.levelConfig = "INFO";
    }
    // ommit getters and setters
}

с помощью 2.22.2

1 ответ

Не могли бы вы показать свой outputClass?

См. https://github.com/apache/camel/blob/camel-2.22.x/components/camel-sql/src/main/docs/sql-component.adoc

Под outputType Говорится:

Сделайте вывод потребителя или производителя в SelectList в качестве List of Map или SelectOne в качестве отдельного Java-объекта следующим образом: a) Если запрос имеет только один столбец, возвращается этот объект JDBC Column. (например, SELECT COUNT() FROM PROJECT вернет объект Long. b) Если запрос имеет более одного столбца, он вернет карту этого результата. c) Если установлен выходной класс, он преобразует результат запроса в объект Java-бина, вызывая все установщики, которые соответствуют именам столбцов. Предполагается, что у вашего класса есть конструктор по умолчанию для создания экземпляра. d) Если запрос дал более одной строки, он генерирует неуникальное исключение результата.

Одна из вещей, которая должна быть сделана, состоит в том, что имена столбцов должны соответствовать установщикам, и должен присутствовать конструктор по умолчанию. Это тот случай?

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