使用Spring Data MongoDB反序列化接口

时间:2018-02-21 16:24:31

标签: spring mongodb enums interface spring-data-mongodb

我目前在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注释,但它不起作用。

谢谢!!!

0 个答案:

没有答案