2017-06-26 24 views
-1

我在我的模型枚举场,当我使用find方法来查询与此字段作为条件的一些数据,它的回报通缉。 但是,当我使用bulkOps和EXCUTE的更新插入操作,它告诉我:
不能序列类com.timanetworks.tpc.vehicle.alarm.domain.enums.FaultType
弹簧数据的MongoDB bulkOps不能没有序列化枚举

我尝试添加enum的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) 

回答

0

这其实是一个错误(DATAMONGO-1678)在Spring数据MongoDB中。它已被固定为1.9.12,1.10.52.0.0.RC1

在编写没有提到版本的时间已被释放。

+0

呜了,谢谢。我觉得西港岛线使用枚举的名称方法的littile时间。 –