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