我目前在MongoDB中序列化/反序列化包含由标记接口定义的属性的问题。实现是Enum。
我的版本是Spring 4.3.7和Spring-data-mongodb 1.10.1。
我的代码听起来像是:
public interface EventType {
String getName();
}
public interface DomainEvent extends Serializable {
UUID getId();
LocalDateTime getOccurredOn();
EventType getEventType();
String getEventName();
}
public abstract class AbstractDomainEvent implements DomainEvent {
private UUID id;
private LocalDateTime occurredOn;
private EventType eventType;
protected AbstractDomainEvent(EventType eventType) {
this.id = UUID.randomUUID();
this.occurredOn = LocalDateTime.now();
this.eventType = eventType;
}
}
public class MyEventOne extends AbstractDomainEvent {
private Object myConcreteData;
public MyEventOne(Object data) {
super(MyEventType.EVENT_ONE);
this.myConcreteData = data;
}
}
public enum MyEventType implements EventType {
EVENT_ONE,
EVENT_N;
@Override
public String getName() {
return this.name();
}
}
好的,好吧。
我的问题是当我尝试反序列化mongoDB中持久存在的事件时。
当我坚持MyEventOne时,Spring数据mongo将对象保持为:
{
"_class" : "xxx.xxx.xxx.MyEventOne",
"_id" : LUUID("d74478e7-258c-52c4-4fc5-aba20a30d4b6"),
"occurredOn" : ISODate("2018-02-21T14:39:53.549Z"),
"eventType" : "EVENT_ONE"
}
}
注意eventType是一个字符串。
当我尝试阅读本文档时,我有这个例外:
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [xxx.xxx.xxx.EventType]
有什么想法吗?有一些解决方案,如插入有关具体Enum实例的元数据信息,如“_class”字段?
我尝试在AbstractDomainEvent的EventType属性中插入@JsonTypeInfo注释,但它不起作用。
谢谢!!!