Mongodb Morphia忽略类型转换器
我将MorphiaV1.3.2与JDK7一起使用,我的文档由对象和子类表示。在与morphia进行了一段时间的斗争以利用其内部映射器之后,我找到了一种方法来改变类根据其文档和其他帖子进行反序列化/序列化的方式,我发现所需的只是拥有一个这样的类:Mongodb Morphia忽略类型转换器,mongodb,java-7,morphia,Mongodb,Java 7,Morphia,我将MorphiaV1.3.2与JDK7一起使用,我的文档由对象和子类表示。在与morphia进行了一段时间的斗争以利用其内部映射器之后,我找到了一种方法来改变类根据其文档和其他帖子进行反序列化/序列化的方式,我发现所需的只是拥有一个这样的类: public class MyClassTypeConverter extends TypeConverter { public ActionTypeConverter() { super(MyClass.class);
public class MyClassTypeConverter extends TypeConverter {
public ActionTypeConverter() {
super(MyClass.class);
}
@Override
public Object decode(final Class targetClass, final Object fromDBObject, final MappedField optionalExtraInfo) {
//do something to parse my class
return new MyClass((DBObject) fromDBObject);
}
@Override
public Object encode(final Object value, final MappedField optionalExtraInfo) {
//do something to represent this as JSON
return value.toString();
}
}
像这样注册这个类型转换器之后
morphia.getMapper().getConverters().addConverter(new MyClassTypeConverter());
现在应该允许使用提供的方法对文档进行反序列化。但是由于某些原因,每个被注册的转换器都被完全忽略了,这种行为有什么原因吗
注意:我找到了这个问题的解决方案。仅将此问题留作参考。在搜索morphia转换器的源代码后,我发现每个注册的转换器都实现了SimpleValueConverter,顺便说一句,它有一个非常误导性的文档(标记接口,TypeConverter返回简单值(int/long、string等))
当我实现它的时候,我有我的怀疑,但由于某种原因,我的转换器没有被忽略,文档被按它应该的方式解析,一切都像魔术一样工作,就像有东西被点击一样,最后我不再感到沮丧。我希望有人会觉得这个有用在浏览了morphia转换器的源代码之后,我发现每个注册的转换器都实现了SimpleValueConverter,顺便说一句,它有一个非常误导人的文档(标记接口,TypeConverter返回简单的值(int/long、string等))
当我实现它的时候,我有我的怀疑,但由于某种原因,我的转换器没有被忽略,文档被按它应该的方式解析,一切都像魔术一样工作,就像有东西被点击一样,最后我不再感到沮丧。我希望有人会觉得这很有用事实确实如此,很好的发现!这确实是事实,很好的发现!
public class MyClassTypeConverter extends TypeConverter implements SimpleValueConverter {
public ActionTypeConverter() {
super(MyClass.class);
}
@Override
public Object decode(final Class targetClass, final Object fromDBObject, final MappedField optionalExtraInfo) {
//do something to parse my class
return new MyClass((DBObject) fromDBObject);
}
@Override
public Object encode(final Object value, final MappedField optionalExtraInfo) {
//do something to represent this as JSON
return value.toString();
}
}