spring-data-mongodb bulkOps不能序列化枚举

时间:2017-06-26 09:51:28

标签: spring-data-mongodb

我的模型中的枚举字段,当我使用find方法以此字段作为条件查询某些数据时,它会按需返回。 但是,当我使用bulkOps并执行upsert操作时,它会告诉我:
无法序列化类com.timanetworks.tpc.vehicle.alarm.domain.enums.FaultType

我尝试添加枚举的name()方法来解决这个问题,并且它成功了!但我仍然无法理解为什么?有人知道吗?


我的模型是这样的:

@Document(collection = "FaultSnapshot")
@TypeAlias("faultSnapshot")
public class FaultSnapshot extends BaseDocument {
    private FaultType type;
    private String vin;
    private Integer faultLevel;
    private Boolean isFault;
    private Date time;
    ...setters and getters...

和FaultType是一个枚举:

public enum FaultType {
     FAULT_EMS,    
     ....
}

这是找代码:

    Query query = new Query();
    if (type != null) {
        query.addCriteria(where("type").is(type));
    }

    Pageable pageable = new PageRequest(pageIndex - 1, pageSize);
    Sort sort = new Sort(Sort.Direction.DESC, "time");
    List<FaultHistory> histories = template.find(query.with(pageable).with(sort),
            FaultHistory.class);
    return new Page<>(count, histories);

这是bulkOps代码:

public void upsertSnapshot(Collection<FaultSnapshot> snapshots) {
    BulkOperations bulk = template.bulkOps(BulkOperations.BulkMode.UNORDERED, FaultSnapshot.class);
    for (FaultSnapshot snapshot : snapshots) {
        Query query = new Query();
        query.addCriteria(where("vin").is(snapshot.getVin()));
        query.addCriteria(where("type").is(snapshot.getType().name()));

        Update update = new Update()
                .set("isFault", snapshot.getFault())
                .set("faultLevel", snapshot.getFaultLevel())
                .set("time", snapshot.getTime())
                .set("vin", snapshot.getVin())
                .set("type", snapshot.getType().name());

        bulk.upsert(query, update);
    }

    bulk.execute();
}

最后,这是错误堆栈:

Exception in thread "Thread-11" java.lang.IllegalArgumentException: can't serialize class com.timanetworks.tpc.vehicle.alarm.domain.enums.FaultType
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:299)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:136)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:36)
at com.mongodb.OutMessage.putObject(OutMessage.java:289)
at com.mongodb.OutMessage.writeUpdate(OutMessage.java:180)
at com.mongodb.OutMessage.update(OutMessage.java:60)
at com.mongodb.DBCollectionImpl$Run$1.executeWriteProtocol(DBCollectionImpl.java:908)
at com.mongodb.DBCollectionImpl$Run$RunExecutor.executeWriteProtocol(DBCollectionImpl.java:1025)
at com.mongodb.DBCollectionImpl$Run$RunExecutor.execute(DBCollectionImpl.java:1016)
at com.mongodb.DBCollectionImpl$Run.executeUpdates(DBCollectionImpl.java:917)
at com.mongodb.DBCollectionImpl$Run.execute(DBCollectionImpl.java:859)
at com.mongodb.DBCollectionImpl.executeBulkWriteOperation(DBCollectionImpl.java:169)
at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:1904)
at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:1899)
at com.mongodb.BulkWriteOperation.execute(BulkWriteOperation.java:116)
at org.springframework.data.mongodb.core.DefaultBulkOperations.execute(DefaultBulkOperations.java:276)
at com.timanetworks.tpc.vehicle.alarm.dao.FaultSnapshotRepositoryImpl.***upsertSnapshot***(FaultSnapshotRepositoryImpl.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)

1 个答案:

答案 0 :(得分:0)

这实际上是Spring Data MongoDB中的一个错误(DATAMONGO-1678)。它已针对1.9.121.10.52.0.0.RC1进行了修复。

在撰写本文时,尚未发布任何上述版本。