Spring boot xstream解析UnknownFieldException异常

来源:互联网 发布:网络文明志愿宣言100字 编辑:程序博客网 时间:2024/05/16 05:25

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

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

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)。
提问者遇到的问题跟我很类似。貌似提问者并没有找到解决方案,也没有采纳下面回复者。不过回答者的答案却提醒了我。于是根据这行代码:

xstream.setClassLoader(DataObjects.class.getClassLoader());

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

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;    }

其中添加了

xstream.setClassLoader(cls.getClassLoader());

问题完美解决。

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

1 0
原创粉丝点击