Spring boot xstream解析UnknownFieldException异常

今天使用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

1

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


通过这个过程,突然想到会不会是spring boot导致的?于是就针对这方面进行搜索排查。还真找到了一篇类似的文章。详情参考(http://*.com/questions/36849817/unknownfieldexception-only-in-spring-boot-app)。

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


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

1

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


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());• 1

问题完美解决。

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

上一篇:IE6尾部重复字符bug(3pxbug的衍生)及避免


下一篇:SQL/PromQL? SLS时序分析选型