xml文件内容:
.....
......
需求:
我定义了一个类为UpdateHandler,该类具有一个private 属性,名为className,在利用xstream从xml实例化类的时候,我用到下面的代码:
xStream.alias("updateHandler", UpdateHandler.class);
xStream.useAttributeFor("className",String.class);
xStream.aliasAttribute("class", "className");
总是出错,出错内容如下:
-------------------------------------
Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: solr.DirectUpdateHandler2 : solr.DirectUpdateHandler2
---- Debugging information ----
required-type : com.giant.dre.config.GiantSolrConfig
cause-message : solr.DirectUpdateHandler2 : solr.DirectUpdateHandler2
class : com.giant.dre.config.GiantSolrConfig
message : solr.DirectUpdateHandler2 : solr.DirectUpdateHandler2
line number : 59
path : /config/updateHandler
cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
-------------------------------
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:63)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:45)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:46)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:117)
at com.thoughtworks.xstream.core.ReferenceByXPathMarshallingStrategy.unmarshal(ReferenceByXPathMarshallingStrategy.java:29)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:826)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:813)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:761)
at com.giant.dre.config.GiantSolrConfigManager.parseXmlAndFillConfig(GiantSolrConfigManager.java:22)
at com.giant.test.XstreamTest.main(XstreamTest.java:15)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: solr.DirectUpdateHandler2 : solr.DirectUpdateHandler2
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:49)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.XStream11XmlFriendlyMapper.realClass(XStream11XmlFriendlyMapper.java:23)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:72)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:60)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:76)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:26)
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:34)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:248)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:155)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:118)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56)
... 9 more
--------------------------------------------------------------
我猜测可能是xml里面的class具有特殊的含义,不能当做一般的属性名来使用,于是我修改上面的代码如下:
首先修改xml为:
.....
......
然后修改代码为:
xStream.alias("updateHandler", UpdateHandler.class);
xStream.useAttributeFor("className",String.class);
xStream.aliasAttribute("classx", "className");
这样果然不会错了。
xml里面的class具有特殊意义吗?或者xstream在解析的时候会理解class为特殊意义?可是我的xml里面的属性名class是不能随便改的,有没有什么办法可以做到吗?
2008年11月17日 16:41