【问题标题】:Caused by: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class com.example.Hobbies原因:org.bson.codecs.configuration.CodecConfigurationException:找不到类 com.example.Hobbies 的编解码器
【发布时间】:2019-08-31 10:42:54
【问题描述】:

如何使用BSONObject 插入嵌入文档?当我尝试插入嵌入文档时,出现如下所示的错误。

例如,我想为 Date 和 firstName 保存空值。我使用 Spring Data Mongo 尝试了一些选项,但效果不佳。

我遇到以下错误:

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:816) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:797) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:324) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at com.example.MongoPocApplication.main(MongoPocApplication.java:24) [classes/:na]
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class com.example.Hobbies.
    at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46) ~[bson-3.8.2.jar:na]
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63) ~[bson-3.8.2.jar:na]
    at org.bson.codecs.configuration.ChildCodecRegistry.get(ChildCodecRegistry.java:51) ~[bson-3.8.2.jar:na]
    at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:231) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.DBObjectCodec.encodeIterable(DBObjectCodec.java:292) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:219) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:149) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:65) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.BasicDBObject.toJson(BasicDBObject.java:194) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.BasicDBObject.toJson(BasicDBObject.java:167) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.BasicDBObject.toJson(BasicDBObject.java:154) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.BasicDBObject.toString(BasicDBObject.java:238) ~[mongodb-driver-core-3.8.2.jar:na]
    at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_171]
    at java.io.PrintStream.println(PrintStream.java:821) ~[na:1.8.0_171]
    at com.example.MongoPocApplication.savePersons(MongoPocApplication.java:70) [classes/:na]
    at com.example.MongoPocApplication.run(MongoPocApplication.java:34) [classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:813) [spring-boot-2.1.4.RELEASE.jar:2.1.4.RELEASE]

Person.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document
public class Person {
    @Id
    private String id;
    @Field
    private String firstName;
    @Field
    private String lastName;

    @Field
    private String emailId;
    @Field
    private List<Hobbies> hobbies;
}

爱好:

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hobbies {
    private String interest;
    private String sports;
}

主要

BSONObject personBsonObj = BasicDBObjectBuilder.start()
                .add("firstName","John")
                .add("lastName", null)
                .add("email","john.kerr@gmail.com")
                .add("hobbies",Arrays.asList(hobbies1, hobbies2, hobbies4)).get();

        BSONObject insert = mongoTemplate.insert(personBsonObj,"person");
        System.out.println(insert);

【问题讨论】:

  • 不幸的是,我无法复制该问题。可以知道使用的spring boot版本和mongo驱动版本吗?
  • 看看这里Codec issue。我尝试使用 mongo 3.8.x 驱动程序,它通过了
  • Spring Boot 版本 2.1.3.RELEASE 和我将 Spring MongoDB 启动器作为依赖 jard 拉出的任何东西保留
  • 您的代码没有嵌入文档。请你试试和我的一样吗?
  • 这里是示例链接issue-55604660

标签: spring spring-data-mongodb


【解决方案1】:

我在我的一堂课中发现了同样的问题。问题是您声明的不仅仅是 bean 的构造函数。不知道为什么,以及如何与异常的消息联系起来。

@AllArgsConstructor
@NoArgsConstructor

这里的问题不是 Lombok,而是 Lombok 在你的类中插入了两个构造函数:

public Person(String id, 
              String firstName, 
              String lastName, 
              String emailId,
              List<Hobbies> hobbies) { /* ... */ }

public Person() { /* ... */ }

删除两个构造函数之一,编解码器的问题就会消失。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我能够解决这个问题,如下所示。我想知道我们是否可以使用 Spring Data Mongo Repository 查询来做到这一点?

    Document hobbies1 = new Document();
    hobbies1.put("interest", "Indoor");
    hobbies1.put("sports", "Chess");
    
    Document hobbies2 = new Document();
    hobbies2.put("Loveoor", "Table Tennis");
    hobbies2.put("Gamedoor", "Cricket");
    
    BSONObject personBsonObj = BasicDBObjectBuilder.start()
        .add("firstName","John")
        .add("lastName", null)
        .add("email","john.kerr@gmail.com")
        .add("hobbies",Arrays.asList(hobbies1, hobbies2)).get();
    BSONObject insert = mongoTemplate.insert(personBsonObj,"person");
        System.out.println(insert);
    

    【讨论】:

    猜你喜欢
    • 2019-06-19
    • 2017-04-07
    • 2018-11-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多