我有以下界面
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "className")
public interface InfoChartInformation {
public String name();
}
以下实现(枚举):
public class InfoChartSummary {
public static enum Immobilien implements InfoChartInformation {
CITY, CONSTRUCTION_DATE;
}
public static enum Cars implements InfoChartInformation {
POWER, MILEAGE;
}
}
然后我在以下实体中使用所有It:
@Entity(noClassnameStored = true)
@Converters(InfoChartInformationMorphiaConverter.class)
public class TestEntity{
@Id
public ObjectId id;
@Embedded
public List<InfoChartInformation> order;
}
杰克逊为了检测解组时的类型,会在列表中的每个枚举中添加className。
我认为morphia会做同样的事情,但枚举列表中没有字段className,并且无法正确解组:java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: java.lang.String cannot be cast to com.mongodb
.DBObject
我想正确的行为应该是保存所有枚举路由(包+名称),而不仅仅是枚举名称。至少以这种方式可以执行解组。有一种方法,morphia默认支持,或者我需要创建自己的转换器(similar to this)?
答案 0 :(得分:1)
我尝试创建自定义转换器:
public class InfoChartInformationMorphiaConverter extends TypeConverter{
public InfoChartInformationMorphiaConverter() {
super(InfoChartInformation.class);
}
@Override
public Object decode(Class targetClass, Object fromDBObject, MappedField optionalExtraInfo) {
if (fromDBObject == null) {
return null;
}
String clazz = fromDBObject.toString().substring(0, fromDBObject.toString().lastIndexOf("."));
String value = fromDBObject.toString().substring(fromDBObject.toString().lastIndexOf(".") + 1);
try {
return Enum.valueOf((Class)Class.forName(clazz), value);
} catch (ClassNotFoundException e) {
return null;
}
}
@Override
public Object encode(final Object value, final MappedField optionalExtraInfo) {
return value.getClass().getName() + "." + ((InfoChartInformation) value).name();
}
}
然后,我将转换器信息添加到morphia morphia.getMapper().getConverters().addConverter(new InfoChartInformationMorphiaConverter());
。
但是,在序列化(或编组)对象以将其保存到数据库中时,将忽略自定义转换器并使用默认的Morphia转换器(仅枚举名称)保存枚举。 / p>
如果我在TestEntity
类只使用属性InfoChartInformation;
而不是List<>InfoChartInformation>
,我的客户转换器就可以使用。但是我需要支持List
答案 1 :(得分:0)
使用:
public class InfoChartInformationMorphiaConverter extends TypeConverter implements SimpleValueConverter
这是使Converter正常工作所必需的标记器界面。