Spring MongoDB - org.bson.codecs.configuration.CodecConfigurationException: не удается найти кодек для класса java.lang.Class

Я оцениваю MongoDB и Spring Data MongoDB в весеннем загрузочном приложении для одного из наших будущих проектов. У меня есть простой POJO, который будет сохранен в MongoDB.

@Document(collection = "customers")
public class CustomerDoc{
@org.springframework.data.annotation.Id
private String Id;
private String firstName;
private String lastName;
private MonetaryAmount amount;

    public CustomerDoc(String firstName, String lastName, MonetaryAmount    amount){
         this.firstName = firstName;
         this.lastName = lastName;
         this.amount = amount;
       }
}

Конфигурация Spring

@Bean
public MongoDbFactory mongoDbFactory() throws Exception {
    MongoClient mongoClient = new MongoClient("localhost", 27017);

    return new SimpleMongoDbFactory(mongoClient, mongoDbName);
}

@Bean
public MongoTemplate mongoTemplate() throws Exception {
    return new MongoTemplate(mongoDbFactory(), mongoConverter());
}

@Bean
public MappingMongoConverter mongoConverter() throws Exception {
    MongoMappingContext mappingContext = new MongoMappingContext();
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
    MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mappingContext);
    mongoConverter.setMapKeyDotReplacement("\\:");
    return mongoConverter;
}

В конфигурации я должен установить ключ замены, потому что без него я получаю исключение:

org.springframework.data.mapping.model.MappingException: ключ карты java.lang.Class содержит точки, но замена не настроена! Прежде всего убедитесь, что ключи карты не содержат точек, или настройте подходящую замену!

Это происходит из-за объекта MonetaryAmount в классе Customer

Репозиторий клиента:

public interface CustomerDocRepository extends MongoRepository<CustomerDoc, String>{

    public List<CustomerDoc> findByFirstName();
}

Теперь, если я попытаюсь сохранить объект клиента, я получу это исключение:

Я использую драйвер mongo 3.2.2 Spring data MongoDB 1.9.1

Любая помощь могла бы быть полезна

Трассировка стека появляется, когда вы пытаетесь преобразовать объект с полем типа java.lang.Class. Пожалуйста, опубликуйте источник для класса MonetaryAmount. Кроме того, тот факт, что вам нужно установить замену точки, связан с тем, что что-то имеет ключевое значение java.lang.Class, как если бы вы вводили в консоль Mongo что-то вроде: db.someCollection.insert({java.lang .Класс: бла})


person Shahid Akhter    schedule 04.05.2016    source источник
comment
MonetaryAmount — это jsr354 API. ссылка   -  person Jon Peterson    schedule 04.05.2016
comment
@JonPeterson, не могли бы вы помочь мне решить связанную с этим проблему? stackoverflow .com/questions/46023866/ ... Хотя я понимаю, что JAXBElement в моем вопросе имеет поле с типом java.lang.Class, как я могу решить проблему?   -  person Shahid Akhter    schedule 18.05.2016
comment
@ShahidAkhter тебе когда-нибудь удавалось это исправить? Столкнулся с той же проблемой в 2020 году   -  person Gaurav Kalra    schedule 03.09.2017
comment
Исключение в потоке «основной» java.lang.IllegalStateException: не удалось выполнить CommandLineRunner в org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:675) в org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:690) в org.springframework.boot.SpringApplication.run(SpringApplication.java:321) в org.springframework.boot.SpringApplication.run(SpringApplication.java:957) в org.springframework.boot.SpringApplication.run(SpringApplication.java:946 ) в com.poc.mongodb.MongoDbApp.main(MongoDbApp.java:43) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) в sun.reflect. DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:497) в com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) Вызвано автор: org.bson.codecs.configuration.CodecConfigurationException: не удается найти кодек для класса java.lang.Class. в org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46) в org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63) в org.bson.codecs.configuration.ProvidersCodecRegistry.get (ProvidersCodecRegistry.java:37) в com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:210) в com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220) в com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java: 196) в com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220) в com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196) в com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220) в com. mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196) в com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:128) в com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61) в com.mongodb.CompoundDBObjectCodec.encode (CompoundDBObjectCodec.java:48) в com.mongodb.CompoundD BObjectCodec.encode(CompoundDBObjectCodec.java:27) в org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63) в org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29) в com.mongodb.connection .InsertCommandMessage.writeTheWrites(InsertCommandMessage.java:101) в com.mongodb.connection. InsertCommandMessage.writeTheWrites(InsertCommandMessage.java:43) в com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBodyWithMetadata(BaseWriteCommandMessage.java:129) в com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160) в com.mongodb.connection .WriteCommandProtocol.sendMessage(WriteCommandProtocol.java:212) в com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:101) в com.mongodb.connection.InsertCommandProtocol.execute(InsertCommandProtocol.java:67) в com.mongodb. connection.InsertCommandProtocol.execute(InsertCommandProtocol.java:37) в com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159) в com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286) в com .mongodb.connection.DefaultServerConnection.insertCommand(DefaultServerConnection.java:115) в com.mongodb.operation. InsertOperation.executeCommandProtocol(InsertOperation.java:76) в com.mongodb.operation.BaseWriteOperation$1.call(BaseWriteOperation.java:141) в com.mongodb.operation.BaseWriteOperation$1.call(BaseWriteOperation.java:133) в com.mongodb .operation.OperationHelper.withConnectionSource(OperationHelper.java:230) в com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:221) в com.mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:133) в com. mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:60) в com.mongodb.Mongo.execute(Mongo.java:781) в com.mongodb.Mongo$2.execute(Mongo.java:764) в com.mongodb. DBCollection.executeWriteOperation(DBCollection.java:333) в com.mongodb.DBCollection.insert(DBCollection.java:328) в com.mongodb.DBCollection.insert(DBCollection.java:319) в com.mongodb.DBCollection.insert(DBCollection) .java:289) в com.mongodb.DBCollection. вставка (DBCollection.java:255) в com.mongodb.DBCollection.insert(DBCollection.java:239) в org.springframework.data.mongodb.core.MongoTemplate$10.doInCollection(MongoTemplate.java:1054) в org.springframework. data.mongodb.core.MongoTemplate$10.doInCollection(MongoTemplate.java:1049) в org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:462) в org.springframework.data.mongodb.core.MongoTemplate .insertDBObjectList(MongoTemplate.java:1049) в org.springframework.data.mongodb.core. MongoTemplate.doInsertBatch(MongoTemplate.java:935)   -  person BooVeMan    schedule 22.04.2020