Fix: ClassCastException when dumping generic bean
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ae977f0..c789aba 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,7 +7,10 @@
</properties>
<body>
<release version="1.7" date="in Mercurial" description="development">
- <action dev="py4fun" type="fix" issue="59">
+ <action dev="py4fun" type="fix" issue="61">
+ Fix: ClassCastException when dumping generic bean (2010-04-01)
+ </action>
+ <action dev="py4fun" type="fix" issue="59">
Provide an example for changing JavaBean properties order (2010-04-01)
</action>
<action dev="py4fun" type="fix" issue="60">
diff --git a/src/main/java/org/yaml/snakeyaml/representer/Representer.java b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
index dc049cd..af6d0b1 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/Representer.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
@@ -21,6 +21,7 @@
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -181,6 +182,10 @@
if (arguments != null) {
if (node.getNodeId() == NodeId.sequence) {
// apply map tag where class is the same
+ if (arguments[0] instanceof TypeVariable) {
+ // generic collections need the tag
+ return;
+ }
Class<? extends Object> t = (Class<? extends Object>) arguments[0];
SequenceNode snode = (SequenceNode) node;
List<Object> memberList = (List<Object>) object;
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java
new file mode 100644
index 0000000..727254f
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue61/GenericBeanTest.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2008-2010 Andrey Somov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.yaml.snakeyaml.issues.issue61;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.JavaBeanDumper;
+import org.yaml.snakeyaml.Util;
+
+public class GenericBeanTest extends TestCase {
+ public void testGenericList() throws Exception {
+ JavaBeanDumper beanDumper = new JavaBeanDumper();
+ ListProvider<String> listProvider = new ListProvider<String>();
+ listProvider.getList().add("foo");
+ listProvider.getList().add("bar");
+ String s = beanDumper.dump(listProvider);
+ // System.out.println(s);
+ assertEquals("list:\n- foo\n- bar\n", s);
+ // parse
+ // JavaBeanLoader<ListProvider> loader = new
+ // JavaBeanLoader<ListProvider>(ListProvider.class);
+ // ListProvider listProvider2 = loader.load(s);
+ // assertEquals("foo", listProvider2.getList().get(0));
+ // assertEquals("bar", listProvider2.getList().get(1));
+ }
+
+ public void testGenericBean() throws Exception {
+ JavaBeanDumper beanDumper = new JavaBeanDumper();
+ ListProvider<Bean> listProvider = new ListProvider<Bean>();
+ Bean foo = new Bean();
+ foo.setName("foo");
+ listProvider.getList().add(foo);
+ Bean bar = new Bean();
+ bar.setName("bar");
+ bar.setNumber(3);
+ listProvider.getList().add(bar);
+ String s = beanDumper.dump(listProvider);
+ // System.out.println(s);
+ String etalon = Util.getLocalResource("issues/issue61-1.yaml");
+ assertEquals(etalon, s);
+ }
+
+ public static class ListProvider<T> {
+ private List<T> list = new ArrayList<T>();
+
+ public List<T> getList() {
+ return list;
+ }
+
+ public void setList(List<T> list) {
+ this.list = list;
+ }
+ }
+
+ public static class Bean {
+ private String name;
+ private int number;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+ }
+
+}
diff --git a/src/test/resources/issues/issue61-1.yaml b/src/test/resources/issues/issue61-1.yaml
new file mode 100644
index 0000000..52e1f43
--- /dev/null
+++ b/src/test/resources/issues/issue61-1.yaml
@@ -0,0 +1,7 @@
+list:
+- !!org.yaml.snakeyaml.issues.issue61.GenericBeanTest$Bean
+ name: foo
+ number: 0
+- !!org.yaml.snakeyaml.issues.issue61.GenericBeanTest$Bean
+ name: bar
+ number: 3