ODPS-SDK调用排坑笔记(1)

一、坑从何来

ODPS表的数据使用,估计每个后端童靴都会碰到,常用就两种:

  1. 将ODPS表清洗后同步到mysql或histore中持久化,然后通过java封装服务能力调用。这种场景常用于在线实时调用;

2.直接调用ODPS-SDK,通过SQL.run(sql)直接获取odps数据,次方法常用离线JOB处理数据;

而我这次使用的及时后者,通过SQL直查的方式获取数据。下面就重点说下碰到一个坑。

二、采坑排查

1.代码写完,收工,源码如下:image
2.期待数据日志的打印,此时异常抛出:
image
3.初步定位返回数据结果有误导致XML解析错误,先看看ODPS源码那行是什么东东:
image
问题浮现:多个XML-parser被加载了,但是使用了错误的解析器,java8优先使用了自带的JAXB而不是com.sun.xml.internal.bind.v2.util.XmlFactory导致的冲突

三、排坑方案
1. 引入三方xml解析包
image
2.排调间接依赖:xml.xerces

<exclusion>
    <groupId> com.alibaba.external</groupId>
    <artifactId>xml.xerces</artifactId>
</exclusion>

四、小结

为什么就用到rt.jar中的xerces类呢,要去看Spring是如何load xml文件的,其实javadoc里面说得比较详细

1、Use the “javax.xml.parsers.DocumentBuilderFactory” system property.

2、Use the properties file "lib/jaxp.properties" in the JRE directory.

3、Use the Services API (as detailed in the JAR specification), if available, to determine the classname. The Services API will look for a classname in the file “META-INF/services/javax.xml.parsers.DocumentBuilderFactory"  in jars available to the runtime.

4、Platform default "DocumentBuilderFactory" instance,也就是类com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl。

如果前面三步都找不到实现类,jdk(好像必须是jdk1.5或以上版本)里自带的DocumentBuilderFactoryImpl将会被使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值