2017-06-13 114 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

相關問題