使用Canal监听数据库时官方提供的canal-client不太方便,我们采用canal-spring-boot-starter这个库,但是这个库有些BUG,目前作者也不再维护了,只能下载源码到本地进行修改后发布到私有仓库中使用,下面步入正题。
类型转换可能报异常
原因是StringConvertUtil.convertType方法参数columnValue可能为空字符串
在数据类型转换之前做下判断即可
static Object convertType(Class<?> type, String columnValue) {
if(columnValue==null){
return null;
}else if (type.equals(Integer.class)) {
if (StringUtils.isEmpty(columnValue)) {
return null;
}
return Integer.parseInt(columnValue);
} else if (type.equals(Long.class)) {
if (StringUtils.isEmpty(columnValue)) {
return null;
}
return Long.parseLong(columnValue);
} else if (type.equals(Boolean.class)) {
if (StringUtils.isEmpty(columnValue)) {
return null;
}
return convertToBoolean(columnValue);
} else if (type.equals(BigDecimal.class)) {
if (StringUtils.isEmpty(columnValue)) {
return null;
}
return new BigDecimal(columnValue);
} else if (type.equals(Double.class)) {
if (StringUtils.isEmpty(columnValue)) {
return null;
}
return Double.parseDouble(columnValue);
} else if (type.equals(Float.class)) {
if (StringUtils.isEmpty(columnValue)) {
return null;
}
return Float.parseFloat(columnValue);
} else if (type.equals(Date.class)) {
if (StringUtils.isEmpty(columnValue)) {
return null;
}
return parseDate(columnValue);
} else if (type.equals(java.sql.Date.class)) {
if (StringUtils.isEmpty(columnValue)) {
return null;
}
return parseDate(columnValue);
} else {
return columnValue;
}
}
复制代码
实体类@Column中字段名添加了“会取不到值
EntryUtil.getColumnName方法替换掉“即可
private static String getColumnName(Field field) {
Column annotation = field.getAnnotation(Column.class);
if (annotation != null) {
return annotation.name().replaceAll("`", "");
} else {
return field.getName();
}
}
复制代码
启动程序后一直打印“获取消息”日志
在application.yml中设置日志级别大于info
logging:
level:
top.javatool.canal.client: warn
复制代码
或者修改AbstractCanalClient,注释掉日志打印
Update时希望得到更新了哪些字段
EntryHandler接口update方法修改如下
default void update(T before, T after, Set<String> updateColumnSet) {
}
复制代码
RowDataHandlerImpl中update添加上updateColumnSet
entryHandler.update(before, after, updateColumnSet);
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END