开发者社区> 问答> 正文

从“String”转换为“BigDecimal”null时出错

在同步的过程中报出如下异常,请问这个问题该怎么排查呢,是表里面某个字段为null引起的?

pid:1 nid:1 exception:setl:com.alibaba.otter.node.etl.extract.exceptions.ExtractException: java.util.concurrent.ExecutionException: org.apache.commons.beanutils.ConversionException: Error converting from 'String' to 'BigDecimal' null Caused by: java.util.concurrent.ExecutionException: org.apache.commons.beanutils.ConversionException: Error converting from 'String' to 'BigDecimal' null at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor.extract(DatabaseExtractor.java:139) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor.extract(DatabaseExtractor.java:81) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor$$FastClassByCGLIB$$f79e22c6.invoke() at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:618) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor$$EnhancerByCGLIB$$de7bc45b.extract() at com.alibaba.otter.node.etl.extract.extractor.OtterExtractorFactory.extract(OtterExtractorFactory.java:50) at com.alibaba.otter.node.etl.extract.ExtractTask$1.run(ExtractTask.java:79) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.commons.beanutils.ConversionException: Error converting from 'String' to 'BigDecimal' null at org.apache.commons.beanutils.converters.AbstractConverter.handleError(AbstractConverter.java:267) at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:164) at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60) at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:470) at com.alibaba.otter.node.etl.common.db.utils.SqlUtils.stringToSqlValue(SqlUtils.java:149) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor$DatabaseExtractWorker.buildTableData(DatabaseExtractor.java:539) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor$DatabaseExtractWorker.run(DatabaseExtractor.java:306) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) ... 5 more Caused by: java.lang.NumberFormatException at java.math.BigDecimal.(BigDecimal.java:494) at java.math.BigDecimal.(BigDecimal.java:383) at java.math.BigDecimal.(BigDecimal.java:806) at org.apache.commons.beanutils.converters.NumberConverter.toNumber(NumberConverter.java:448) at org.apache.commons.beanutils.converters.NumberConverter.convertToType(NumberConverter.java:268) at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:156) ... 12 more

使用了自由门,我正在看源代码,定位到DatabaseExtractWorker.buildTableData方法的 data.columnValues[i] = SqlUtils.stringToSqlValue(keyColumn.getColumnValue(), tableColumn.getTypeCode(), tableColumn.isRequired(), false);

从报错上应该是数据库里面有一个类型为decimal的字段值为null在转BigDecimal的时侯失败了,数据库为mysql,但是因为表非常多,不容易查找。

我看到ConvertUtilsBean类的convert方法里面有 if (log.isDebugEnabled()) { log.debug("Convert string '" + value + "' to class '" + clazz.getName() + "'"); } 这个debug模式怎么开启呢?

目前otter采用的版本为4.2.13

经过查看代码发现当mysql数据类型为numeric或者decimal的时侯会转成java的BigDeicmal。 经过查找,只找到了两张表的联合主键里面某个字段为decimal类型,但是这两张表里面都没有数据……

原提问者GitHub用户 LWT1118

展开
收起
大圣东游 2023-06-21 16:29:07 204 0
2 条回答
写回答
取消 提交回答
  • 云端行者觅知音, 技术前沿我独行。 前言探索无边界, 阿里风光引我情。

    根据您提供的错误信息,看起来是在将字符串(String)转换为BigDecimal时出现了问题。具体来说,错误信息中的Error converting from 'String' to 'BigDecimal' null表明在转换过程中遇到了一个空值(null)。

    要排查这个问题,您可以考虑以下几个方面:

    1. 检查数据源:确认数据源中是否存在空值(null)的情况。如果数据源中的某个字段包含了空值,并且在同步过程中尝试将其转换为BigDecimal,就会出现这个错误。您可以检查数据源中的相关字段,确保它们没有空值。

    2. 检查数据类型匹配:确保在进行转换时,源数据的类型与目标类型匹配。如果源数据的类型不是字符串(String),或者目标类型不是BigDecimal,也可能导致转换错误。请检查源数据的类型和目标类型是否正确匹配。

    3. 检查转换逻辑:如果您在同步过程中使用了自定义的转换逻辑,例如使用转换函数或脚本进行数据转换,那么请检查转换逻辑是否正确处理了空值的情况。确保在转换过程中对空值进行了适当的处理,以避免出现转换错误。

    4. 检查数据同步工具配置:如果您使用了数据同步工具(如阿里云的数据传输服务DTS)进行数据同步,那么请检查工具的配置是否正确。确保配置了正确的数据类型映射和转换规则,以便在同步过程中正确处理数据类型转换。

    如果问题仍然存在,建议提供更多关于您的环境和操作的详细信息,以便我能够提供更具体的帮助。

    2023-06-26 23:20:36
    赞同 展开评论 打赏
  • 原因是retl_buffer的pk_data写入了列的名称而不是value

    原回答者GitHub用户 LWT1118

    2023-06-21 17:40:14
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多