#852 - javax.persistence.PersistenceException: No ScalarType registered for class Foo$1 ... where Foo is an Enum where individual instances override a method (example below).

This commit is contained in:
Rob Bygrave
2016-11-06 20:33:56 +13:00
parent d84080fb76
commit 2a6d38eef2
6 changed files with 85 additions and 20 deletions
@@ -0,0 +1,28 @@
package com.avaje.ebean.server.type;
import com.avaje.ebean.annotation.EnumValue;
/**
* Enum with method overrides (and hence multiple actual classes).
*/
public enum MyEnum {
@EnumValue("A")Aval {
@Override
public String doSomething() {
return "bar";
}
},
@EnumValue("B")Bval,
@EnumValue("C")Cval {
@Override
public String doSomething() {
return "baz";
}
};
public String doSomething() {
return "foo";
}
}
@@ -23,6 +23,31 @@ import static org.assertj.core.api.Assertions.assertThat;
public class TestTypeManager extends BaseTestCase {
@Test
public void testEnumWithSubclasses() throws SQLException {
DefaultTypeManager typeManager = createTypeManager();
ScalarType<?> type = typeManager.createEnumScalarType(MyEnum.class);
typeManager.addEnumType(type, MyEnum.class);
Object val = type.read(new DummyDataReader("A"));
assertThat(val).isEqualTo(MyEnum.Aval);
val = type.read(new DummyDataReader("B"));
assertThat(val).isEqualTo(MyEnum.Bval);
val = type.read(new DummyDataReader("C"));
assertThat(val).isEqualTo(MyEnum.Cval);
ScalarType<?> typeGeneral = typeManager.getScalarType(MyEnum.class);
assertThat(typeGeneral).isNotNull();
ScalarType<?> typeB = typeManager.getScalarType(MyEnum.Bval.getClass());
assertThat(typeB).isNotNull();
ScalarType<?> typeA = typeManager.getScalarType(MyEnum.Aval.getClass());
assertThat(typeA).isNotNull();
ScalarType<?> typeC = typeManager.getScalarType(MyEnum.Cval.getClass());
assertThat(typeC).isNotNull();
}
@Test
public void testEnumWithChar() throws SQLException {
@@ -88,7 +113,7 @@ public class TestTypeManager extends BaseTestCase {
String val;
public DummyDataReader(String val) {
DummyDataReader(String val) {
super(null, null);
this.val = val;
}