XStream的fromXml为什么不会报错的空程序

板块整改中博客分类:
最近在做xstream对bean和xml进行转化的小例子,在xml转化成bean时出现一个问题。话不多说,先贴代码:
&
import java.io.F
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
import java.io.ObjectInputS
import java.io.ObjectOutputS
import org.junit.A
import org.junit.B
import org.junit.T
import com.thoughtworks.xstream.XS
public class XStreamTest {
private XStream xstream=
private ObjectOutputStream& out =
&&& private ObjectInputStream in =
&&& private Stuent stu=
&&&
&&& @Before
&&& public void init(){
&&&
xstream =new XStream();
&&&
stu =new Stuent();
&&&
stu.setAddress("china");
&&&
stu.setEmail("");
&&&
stu.setName("chen");
&&&
stu.setId(1);
&&&
Profile p =new Profile("软件工程师", "", "XXXXX");
&&&
stu.setProfile(p);
&&& }
&&&
&&& @After
&&& public void destory() {
&&&&&&& xstream =
&&&&&&& stu =
&&&&&&& try {
&&&&&&&&&&& if (out != null) {
&&&&&&&&&&&&&&& out.flush();
&&&&&&&&&&&&&&& out.close();
&&&&&&&&&&& }
&&&&&&&&&&& if (in != null) {
&&&&&&&&&&&&&&& in.close();
&&&&&&&&&&& }
&&&&&&& } catch (IOException e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&& }
&&&&&&& System.gc();
&&& }
&&& @Test
&&& public void writeBean2XML() {
&&&&&&& try {
&&&&&&&
&&&&&&&&& System.out.println("------------Bean-&XML------------");
&&&&&&&&& System.out.println(xstream.toXML(stu));
&&&&&&&&& System.out.println("-----------重命名后的XML----------");&&&&&&&
&&&&&&&&&&& //类重命名
&&&&&&&&& & xstream.alias("account", Stuent.class);&
&&&&&&&&&&& xstream.alias("message", Profile.class);
&&&&&&&&&&& //属性重命名
&&&&&&&&&&& xstream.aliasField("编号", Stuent.class, "id");
&&&&&&&&&&& xstream.aliasField("邮件", Stuent.class, "email");
&&&&&&&&&&& xstream.aliasField("姓名", Stuent.class, "name");
&&&&&&&&&&& xstream.aliasField("地址", Stuent.class, "address");
&&&&&&&&&&& xstream.aliasField("工作", Profile.class, "job");
&&&&&&&&&&& xstream.aliasField("电话", Profile.class, "tel");
&&&&&&&&&&& xstream.aliasField("备注", Profile.class, "remark"); &
&&&&&&&&&&& FileOutputStream ops = new FileOutputStream(new File("d:\\111.xml"));&&
xstream.toXML(stu, ops);&&
&&&&&&&&&&& ops.close();
&&&&&&&&&&& System.out.println(xstream.toXML(stu));
&&&&&&& } catch (Exception e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&& }
&&& }
&&& @Test
&&& public void readXML2Bean(){
&&&
&&&&&&&&&&& FileInputStream ops = new FileInputStream(new File("d:\\111.xml"));&&
&&&&&&&&&&& xstream.fromXML(ops,stu);&&
&&&&&&&&&&& stu.getName();
&&&&&&&&&&& stu.getId();
&&&&&&&&&&& stu.getAddress();
&&&&&&&&&&& stu.getEmail();
&&&&&&&&&&& stu.getProfile();
&&&&&&&&&&& System.out.println(stu.getName());&&
&&&&&&&&&&& System.out.println(stu.getId());&&
&&&&&&&&&&& System.out.println(stu.getAddress());&&
&&&&&&&&&&& System.out.println( stu.getEmail());
&&&&&&&&&&& System.out.println( stu.getProfile());&&&&&
&&&&&&&&&&& ops.close();&&
&&&&&&&&&&& } catch (Exception e) {&&
&&&&&&&&&&&&&&& e.printStackTrace();&&
&&&&&&&&&&& }&&&&&&
我添加了红色字体部分的,对类及属性进行别名处理,不加别名时,xml是可以解析成bean的,加了之后解析就报错了;
com.thoughtworks.xstream.mapper.CannotResolveClassException: account : account
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.core.TreeUnmarshaller.start(TreeUnmarshaller.java:113)
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:796)
at test.XStreamTest.readXML2Bean(XStreamTest.java:87)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
小弟愚钝,还请大家赐教啊~~~
&&&
sys_ks_cnm
浏览: 12115 次
来自: 南京
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'> 博客详情
摘要: 废话不多说,直接上源码!
import java.lang.annotation.ElementT
import java.lang.annotation.R
import java.lang.annotation.RetentionP
import java.lang.annotation.T
* Created by GongXunyao on 15/12/28.
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface XStreamCDATA {
import com.mon.officialapi.tianping2.utility.annotation.XStreamCDATA;
import com.thoughtworks.xstream.XS
import com.thoughtworks.xstream.annotations.XStreamA
import com.thoughtworks.xstream.core.util.QuickW
import com.thoughtworks.xstream.io.HierarchicalStreamW
import com.thoughtworks.xstream.io.naming.NameC
import com.thoughtworks.xstream.io.naming.NoNameC
import com.thoughtworks.xstream.io.xml.PrettyPrintW
import com.thoughtworks.xstream.io.xml.XppDomD
import java.io.W
import java.lang.reflect.F
* Created by GongXunyao on .
* XStream工厂类
public class XStreamFactory {
public static XStream getXStream() {
final NameCoder nameCoder = new NoNameCoder ();
XStream xStream = new XStream(new XppDomDriver (nameCoder) {
public HierarchicalStreamWriter createWriter(Writer out) {
//输出格式化的xml字符串
return new PrettyPrintWriter (out, nameCoder) {
//输出压缩的xml字符串,删除多余的空白符
//return new CompactWriter (out, nameCoder) {
boolean cdata =
Class&?& targetClass =
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
if(targetClass == null){
targetClass =
cdata = needCDATA(targetClass,name);
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write(&&![CDATA[&);
writer.write(text);
writer.write(&]]&&);
writer.write(text);
private static boolean needCDATA(Class&?& targetClass, String fieldAlias){
boolean cdata =
//first, scan self
cdata = existsCDATA(targetClass, fieldAlias);
//if cdata is false, scan supperClass until java.lang.Object
Class&?& superClass = targetClass.getSuperclass();
while(!superClass.equals(Object.class)){
cdata = existsCDATA(superClass, fieldAlias);
superClass = superClass.getSuperclass();
private static boolean existsCDATA(Class&?& clazz, String fieldAlias){
//scan fields
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
//1. exists XStreamCDATA
if(field.getAnnotation(XStreamCDATA.class) != null ){
XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class);
//2. exists XStreamAlias
if(null != xStreamAlias){
if(fieldAlias.equals(xStreamAlias.value()))//matched
}else{// not exists XStreamAlias
if(fieldAlias.equals(field.getName()))
import com.mon.util.E
import com.thoughtworks.xstream.XS
* Created by GongXunyao on .
public class XStreamUtility {
private static final XStream xStream = XStreamFactory.getXStream ();
* Javabean 转XML
* @param t 待转javabean对象
* @param &T&
* @return xml字符串
public static &T& String toXml(T t, Encoding encoding){
String headLine = &&?xml version=\&1.0\& encoding=\&&+ encoding.getEncoding () +&\&?&&;
return headLine + xStream.toXML ( t );
* XML字符串转javabean
* @param xmlStr xml字符串
* @param &T&
* @return Java对象
public static &T& T toJavaBean(String xmlStr){
return (T) xStream.fromXML ( xmlStr);
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥下次自动登录
现在的位置:
& 综合 & 正文
使用XStream需注意的问题
这些问题是我在实际工作中遇到的,遇到一个问题就记一个问题,因为我这人脑子不太好,过段时间就会想不起来怎么解决了。
(一) 类的继承关系,在转化为xml时,父类节点应添加class属性,指明当前是哪个子类继承了它,否则在由xml转化为Object时会出错,因为XStream并不知道该把当前节点实例化为哪种类型。
(1)一个抽象类 Animal.java
package xml_public abstract class Animal ...{
private int
public int getAge() ...{
public void setAge(int age) ...{
this.age =
(2) Pig继承自Animal
package xml_public class Pig extends Animal...{
private int
public int getWeight() ...{
public void setWeight(int weight) ...{
this.weight =
(3) AnimalContor类中包含Animal类型的变量
package xml_public class AnimalContor ...{
public Animal getAnimal() ...{
public void setAnimal(Animal animal) ...{
this.animal =
public String getId() ...{
public void setId(String id) ...{
(4) 将AnimalContor对象转化为xml
//实例化一个AnimalContor对象
AnimalContor ac=new AnimalContor();
ac.setId("<span style="COLOR: #01");
//生成Pig对象,并作为AnimalContor的Animal变量实例
Pig pig=new Pig();
pig.setAge(<span style="COLOR: #);
pig.setWeight(<span style="COLOR: #0);
ac.setAnimal(pig);
//将对象转化为xml
XStream xstream=new XStream(new DomDriver());
xstream.alias("animalcontor",AnimalContor.class);
String strxml=xstream.toXML(ac);
System.out.println(strxml);
&animalcontor&
&id&<span style="COLOR: #01&/id&
&animal class="xml_chb.Pig"&
&weight&<span style="COLOR: #0&/weight&
&age&<span style="COLOR: #&/age&
&/animal&&/animalcontor&
注意,animal节点有class属性,表明当前类由哪个子类来实现
(5) 将xml转化为AnimalContor对象
animal节点有class属性
String str1="&animalcontor&&id&0002&/id&&animal class='xml_chb.Pig'&&weight&100&/weight&&age&11&/age&&/animal&&/animalcontor&";
AnimalContor ac1=(AnimalContor)xstream.fromXML(str1);
System.out.println(ac1.getId());
输出:0002
animal节点没有class属性,会抛出异常
String str2="&animalcontor&&id&0003&/id&&animal&&weight&100&/weight&&age&11&/age&&/animal&&/animalcontor&";
AnimalContor ac2=(AnimalContor)xstream.fromXML(str2);
System.out.println(ac2.getId());
抛出如下异常:
java.lang.InstantiationError: xml_chb.Animal at sun.reflect.GeneratedSerializationConstructorAccessor3.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Constructor.java:274) at com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider.newInstance(Sun14ReflectionProvider.java:54) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:223) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:117) at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56) at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:45) at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:46) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:182) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:159) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:118) at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56) 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.thoughtworks.xstream.XStream.fromXML(XStream.java:753) at xml_chb.AnimalContor.main(AnimalContor.java:41)Exception in thread "main"
&&&&推荐文章:
【上篇】【下篇】博客分类:
在xml 转 pojo 的时候 去除不想要的xml 节点& 有两种方式
1:override wrapM
//代码
public class myxstream extends XStream {
&&&& @Override
&&&& protected MapperWrapper wrapMapper(MapperWrapper next) {
&&&&&&&& return new MapperWrapper(next) {
&&&&&&&&&&&& @Override
&&&&&&&&&&&& public boolean shouldSerializeMember(@SuppressWarnings("rawtypes") Class definedIn, String fieldName) {
&&&&&&&&&&&&&&&& // 不能识别的节点,掠过。
&&&&&&&&&&&&&&& if (definedIn == Object.class) {
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&& // 节点名称为fileName的掠过
&&&&&&&&&&&&&&& if (fieldName.equals("fileName")) {
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&& return super.shouldSerializeMember(definedIn, fieldName);
&&&&&&&&&&&& }
&&&&&&&& };
&&&& }
2: 使用方法 x.omitField(A.class, "name");
(470.4 KB)
下载次数: 0
learnjavaavaj
浏览: 3155 次
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 报500错误的原因 的文章

 

随机推荐