0

当我使用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

4

1 回答 1

1

你能展示你的outputClass吗?

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

根据outputType它指出:

通过以下方式将消费者或生产者的输出作为 Map 列表或 SelectOne 作为单个 Java 对象输出到 SelectList: a) 如果查询只有单个列,则返回该 JDBC Column 对象。(例如 SELECT COUNT( ) FROM PROJECT 将返回一个 Long 对象。b)如果查询有多个列,那么它将返回该结果的 Map。c) 如果设置了 outputClass,那么它将通过调用与列名匹配的所有 setter 将查询结果转换为 Java bean 对象。它将假设您的类有一个默认构造函数来创建实例。d) 如果查询导致多于一行,则抛出非唯一结果异常。

应该做的一件事是列名应该与设置器匹配,并且应该存在默认构造函数。是这样吗?

于 2019-01-26T16:03:01.033 回答