这次不啰嗦那么多,就简单记录一下。
com.thoughtworks.xstream.security.ForbiddenClassException这个错误在我调用fromXML()方法突然就蹦出来了,找了很多解决方法,一个一个尝试了,最终只能大致确定的是:
1. 出现这个问题的绝大多数是XStream的1.4.x版本,升级到1.5.x可能就没这个问题了;
2. 解决这个问题,只需要添加代码,如下:
xstream.setupDefaultSecurity(xstream); // to be removed after 1.5 xstream.allowTypesByWildcard(new String[] { "test2090715.**" });
下面附上我在理解XStream时写的简单的xml、Javabean转换小demo。
Test类:
package test2090715; import java.util.Arrays; import java.util.Date; import java.util.List; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class Test { public static void main(String[] args) { //XStream初始化 XStream xstream = new XStream(new DomDriver("UTF-8")); xstream.setupDefaultSecurity(xstream); // to be removed after 1.5 xstream.allowTypesByWildcard(new String[] { "test2090715.**" });
//JavaBean -> xml Person person = new Person("hah",15,new Date(),Arrays.asList(new String[] {"a","b","c"})); String xml = xstream.toXML(person); System.out.println(xml);
//JavaBean -> xml Person[] ps = {new Person("hah",15,new Date(),Arrays.asList(new String[] {"a","b","c"})), new Person("hah",15,new Date(),Arrays.asList(new String[] {"d","e","f"})), new Person("hah",15,new Date(),Arrays.asList(new String[] {"h","i","j"})) }; List<Person> list = Arrays.asList(ps); String xml2 = xstream.toXML(list); System.out.println(xml2);
//xml -> JavaBean String xml3 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<java.util.Arrays_-ArrayList>\r\n" + " <a class=\"test2090715.Person-array\">\r\n" + " <test2090715.Person>\r\n" + " <name>hah</name>\r\n" + " <age>15</age>\r\n" + " <date>2019-07-16 01:51:03.196 UTC</date>\r\n" + " <arrayList class=\"java.util.Arrays$ArrayList\">\r\n" + " <a class=\"string-array\">\r\n" + " <string>a</string>\r\n" + " <string>b</string>\r\n" + " <string>c</string>\r\n" + " </a>\r\n" + " </arrayList>\r\n" + " </test2090715.Person>\r\n" + " <test2090715.Person>\r\n" + " <name>hah</name>\r\n" + " <age>15</age>\r\n" + " <date>2019-07-16 01:51:03.196 UTC</date>\r\n" + " <arrayList class=\"java.util.Arrays$ArrayList\">\r\n" + " <a class=\"string-array\">\r\n" + " <string>d</string>\r\n" + " <string>e</string>\r\n" + " <string>f</string>\r\n" + " </a>\r\n" + " </arrayList>\r\n" + " </test2090715.Person>\r\n" + " <test2090715.Person>\r\n" + " <name>hah</name>\r\n" + " <age>15</age>\r\n" + " <date>2019-07-16 01:51:03.196 UTC</date>\r\n" + " <arrayList class=\"java.util.Arrays$ArrayList\">\r\n" + " <a class=\"string-array\">\r\n" + " <string>h</string>\r\n" + " <string>i</string>\r\n" + " <string>j</string>\r\n" + " </a>\r\n" + " </arrayList>\r\n" + " </test2090715.Person>\r\n" + " </a>\r\n" + "</java.util.Arrays_-ArrayList>"; List<Person> plist = (List<Person>) xstream.fromXML(xml3); System.out.println(plist); } }
Person类:
package test2090715; import java.util.ArrayList; import java.util.Date; import java.util.List; public class Person { private String name; private Integer age; private Date date; private List<String> arrayList; public Person(String name, Integer age, Date date, List<String> arrayList) { super(); this.name = name; this.age = age; this.date = date; this.arrayList = arrayList; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public List<String> getArrayList() { return arrayList; } public void setArrayList(List<String> arrayList) { this.arrayList = arrayList; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", date=" + date + ", arrayList=" + arrayList + "]"; } }