前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring boot xstream解析UnknownFieldException异常

Spring boot xstream解析UnknownFieldException异常

作者头像
程序新视界
发布2022-05-06 09:36:02
4550
发布2022-05-06 09:36:02
举报
文章被收录于专栏:丑胖侠丑胖侠

今天使用xstream解析xml文件,遇到一个特别隐蔽的问题,花费了几乎两个小时才解决。因此,记录一下,帮助其他遇到类似问题的同行们。

刚开始通过spring boot启动一个web服务,访问一个指定url,在controller层会去解析一个xml文件,并进行其他业务处理。可是每次请求都会报类似的异常:

代码语言:javascript
复制
Caused by: com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field workshop.tokenizer.data.Attributes.attribute 

也就是说我配置的实体(通过注解形式)中配置的字段,xstream的注解并没有识别到。查找了各种方法,文章都没有解决问题。后来出于方便测试,不用每次都起spring boot服务,就把解析xml的方法写在一个mian方法里面了,执行,马上成功了。以为解决了问题,结果回到web应用,问题依然存在。

通过这个过程,突然想到会不会是spring boot导致的?于是就针对这方面进行搜索排查。还真找到了一篇类似的文章。详情参考(http://stackoverflow.com/questions/36849817/unknownfieldexception-only-in-spring-boot-app)。 提问者遇到的问题跟我很类似。貌似提问者并没有找到解决方案,也没有采纳下面回复者。不过回答者的答案却提醒了我。于是根据这行代码:

代码语言:javascript
复制
xstream.setClassLoader(DataObjects.class.getClassLoader());

把我对应的代码修改如下:

代码语言:javascript
复制
public static <T> T toBean(String xmlStr, Class<T> cls) {
        XStream xstream = new XStream(new DomDriver());
        xstream.setClassLoader(cls.getClassLoader());
        xstream.processAnnotations(cls);
        T obj = (T) xstream.fromXML(xmlStr);
        return obj;
    }

其中添加了

代码语言:javascript
复制
xstream.setClassLoader(cls.getClassLoader());

问题完美解决。

问题的原因:当未指定classloader的时候,spring boot未正确使用classloader。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档