2017-06-13 108 views
0

我在MongoDB中使用MongoDB与Spring Boot(1.4.4.RELEASE),我在MongoDB数据库中存储一个对象并得到一个CodecConfigurationException当我尝试获取Object AggregationOperation。CodecConfigurationException在MongoDB中找不到DateTime的编解码器

我MongoDbConfig是

@Configuration 
public class MongoDbConfig { 

    @Value("${mongodb_host}") 
    private String host; 

    @Value("${mongodb_port}") 
    private String port; 

    @Value("${mongodb_name}") 
    private String dataBase; 

    @Value("${mongodb_username}") 
    private String userName; 

    @Value("${mongodb_password}") 
    private String password;  

    public @Bean MongoClient mongoClient() { 
     return new MongoClient(new ServerAddress("127.0.0.1", 27017), new ArrayList<MongoCredential>() { 
      { 
       add(MongoCredential.createCredential(userName, dataBase,password.toCharArray())); 
      } 
     }); 
    } 

    public @Bean MongoDbFactory mongoDbFactory() throws Exception { 
     return new SimpleMongoDbFactory(mongoClient(), dataBase); 
    } 
    @Bean 
    public MongoTemplate mongoTemplate() throws Exception { 
     MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory()); 
     return mongoTemplate; 
    } 
} 

我的文档是

@Document(collection = "FuelBook") 
public class FuelBook implements Serializable { 
    private String orgId; 
    private String branchId; 
    private String vehicleId; 
    private String driverName; 
    private DateTime date; 
    private boolean isActive = true; 
    private Double kmsReading; 
    private float costOfFuel; 
    private String typeOfFuel; 
//getter and setter 
} 

我使用下面的代码

public String addFuelBookDetails(AddFuelBookDetailsDTO request, 
      String orgId, String branchId, String vehicleId) { 
     try{    
      if(!mongoTemplate.collectionExists(FuelBook.class)){ 
       mongoTemplate.createCollection(FuelBook.class); 
      } 
      FuelBook fuelBook = new FuelBook(); 
      fuelBook.setOrgId(orgId); 
      fuelBook.setBranchId(branchId); 
      fuelBook.setVehicleId(vehicleId); 
      fuelBook.setDriverName(request.getDriverName()); 
      fuelBook.setDate(TimeConversionHelper.getJodaDate(request.getDate(), 
      "yyyy-MM-dd")); 
      fuelBook.setCostOfFuel(Float.parseFloat((request.getCostOfFuel()))); 
      fuelBook.setKmsReading(Double.parseDouble(request.getKmsReading())); 
      fuelBook.setTypeOfFuel(request.getTypeOfFuel()); 
      mongoTemplate.insert(fuelBook, "FuelBook"); 
      return StringConstants.SUCCESS; 

     } catch(Exception e) { 
     return null; 
     } 
    } 

而这个代码来创建字符串为datetime

创建文档使用下面的代码试试10

让所有FuelBooks

AggregationOperation org = Aggregation.match(Criteria.where("orgId").is(orgId)); 
    AggregationOperation branch = Aggregation.match(Criteria.where("branchId").is(branchId)); 
    AggregationOperation vehicle = Aggregation.match(Criteria.where("vehicleId").is(vehicleId));    
    DateTime jodaStartTime = TimeConversionHelper.getJodaDate(request.getStartTime(), "yyyy-MM-dd"); 
    DateTime jodaEndTime = TimeConversionHelper.getJodaDate(request.getEndTime(), "yyyy-MM-dd"); 
    AggregationOperation startTime = Aggregation.match(Criteria.where("date").gte(jodaStartTime)); 
    AggregationOperation endTime = Aggregation.match(Criteria.where("date").lte(jodaEndTime)); 
    AggregationOperation offsetAggregation=Aggregation.skip(offset); 
    AggregationOperation limitAggregation=Aggregation.limit(limit); 
    Aggregation aggregation = Aggregation.newAggregation(org, branch, vehicle, startTime, endTime,offsetAggregation,limitAggregation);   
    AggregationResults<FuelBook> result = mongoTemplate.aggregate(aggregation, "FuelBook" ,FuelBook.class);   
    if(result!=null && result.getMappedResults()!=null && !result.getMappedResults().isEmpty()) { 
    List<FuelBook> fuelLists = result.getMappedResults(); 

不过,我遇到了此错误消息:

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.joda.time.DateTime. 
     at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46) 
     at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63) 
     at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:37) 
     at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:210) 
     at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220) 
     at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196) 
     at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220) 
     at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196) 
     at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220) 
     at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196) 
     at com.mongodb.DBObjectCodec.encodeIterable(DBObjectCodec.java:269) 
     at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:198) 
     at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:128) 
     at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61) 
     at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63) 
     at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29) 
     at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:253) 
     at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:205) 
     at com.mongodb.connection.CommandMessage.encodeMessageBodyWithMetadata(CommandMessage.java:75) 
     at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160) 
     at com.mongodb.connection.CommandProtocol.sendMessage(CommandProtocol.java:184) 
     at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:108) 
     at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159) 
     at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286) 
     at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:173) 
     at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:215) 
     at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:186) 
     at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:178) 
     at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:91) 
     at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:84) 
     at com.mongodb.operation.CommandReadOperation.execute(CommandReadOperation.java:55) 
     at com.mongodb.Mongo.execute(Mongo.java:773) 
     at com.mongodb.Mongo$2.execute(Mongo.java:760) 
     at com.mongodb.DB.executeCommand(DB.java:653) 
     at com.mongodb.DB.command(DB.java:423) 
     at com.mongodb.DB.command(DB.java:439) 
     at com.mongodb.DB.command(DB.java:394) 
     at org.springframework.data.mongodb.core.MongoTemplate$3.doInDB(MongoTemplate.java:390) 
     at org.springframework.data.mongodb.core.MongoTemplate$3.doInDB(MongoTemplate.java:388) 
     at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:446) 
     at org.springframework.data.mongodb.core.MongoTemplate.executeCommand(MongoTemplate.java:388) 
     at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1556) 
     at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1491) 
     at com.icarat.eshiksha.mongodb.dao.impl.FuelBookDAOImpl.getFuelBookDetails(FuelBookDAOImpl.java:153) 
     at com.icarat.eshiksha.rest.controller.FuelBookController.getFuelBookDetails(FuelBookController.java:132) 

任何人都可以提供关于为什么发生这种情况的一些见解?谢谢

+0

请问你的Spring配置样子? 'JodaTimeConverters'应该自动在Mongo上注册。 – Veeram

+0

@veeram我更新了我的问题。 JodaTimeConverts是静态方法的类sir – vishwa

+0

你的配置看起来不错。当它在类路径中找到joda jar时,Spring会自动注册它。 。检查'CustomConversions'构造函数。您可以尝试调试该类。 – Veeram

回答

0

我发现从this链路解决方案

我改变我的mongoClient在MongoDbConfig像

public @Bean MongoClient mongoClient() { 
    BSON.addEncodingHook(DateTime.class, new JodaTimeTransformer()); 
    BSON.addDecodingHook(Date.class, new JodaTimeTransformer()); 
    return new MongoClient(new ServerAddress("127.0.0.1", 27017), new ArrayList<MongoCredential>() { 
        { 
      add(MongoCredential.createCredential(userName, dataBase,password.toCharArray())); 
        } 
          }); 
    } 

,我只是添加JodaTimeTransformer类到我的项目的classpath

相关问题