【问题标题】:Spring Boot findById not working for MongoDBSpring Boot findById 不适用于 MongoDB
【发布时间】:2022-01-18 20:32:14
【问题描述】:

我正在尝试使用 mongodb 作为数据库引擎在 springboot 上做一个简单的 get 查询

我已经尝试过几种方法(将数据作为 ObjectId 发送,甚至更改存储库)

public ResponseEntity<Track> get(String trackId) {
    Track find = mongoTemplate.findById(new ObjectId(trackId), Track.class);

    Optional<Track> track = tracksRepository.findById(trackId);

    if (track.isPresent()) {
        return new ResponseEntity<>(track.get(), HttpStatus.OK);
    }

    return new ResponseEntity<>(HttpStatus.NOT_FOUND);

}

使用 mongo 配置

@Configuration
@EnableMongoRepositories(basePackages = "data.store.repositories")
public class MongoConfig extends AbstractMongoClientConfiguration {

    private final Logger LOGGER = Logger.getLogger(this.getClass().getSimpleName());

    @Primary
    @Bean
    @Override
    public MongoClient mongoClient() {

        return MongoClients.create(MongoClientSettings.builder()
            .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress(host, port))))
            .build());
    }

    private MongoCredential mongoCredentials() {
        return MongoCredential.createCredential(username, database, password.toCharArray());
    }

    @Bean
    public MongoTemplate mongoTemplate() {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), getDatabaseName());
        mongoTemplate.setReadPreference(ReadPreference.secondaryPreferred());
        return mongoTemplate;
    }

    protected String getDatabaseName() {
        return database;
    }

    @Override
    public boolean autoIndexCreation() {
        return false;
    }

}

编辑:为上下文添加类

@Document("track")
public class Track {
    @Id
    @Field(ATTR_ID)
    @JsonProperty(ATTR_ID)
    public String id;
    public static final String ATTR_ID = "id";
}

并始终为空,我的数据库中存在现有键。你能帮我找出问题吗?

提前致谢

【问题讨论】:

  • StackOverflow 避免我粘贴更多数据。我正在使用 gradle classpath("org.springframework.boot:spring-boot-gradle-plugin:2.6.2")
  • 更准确地说,我尝试了所有这些答案stackoverflow.com/questions/60023943/…
  • 你也可以发布Track 课程吗?
  • 我也尝试将@MongoId 添加到其中(抱歉将其添加到 cmets。所以不会让我将其添加到帖子中)
  • 你有两个findById 方法——一个在tracksRepository 上,另一个在mongoTemplate 上。哪个不工作

标签: java mongodb spring-boot


【解决方案1】:

我用类似的配置类尝试了这个,发现以下使用MongoTemplate创建/访问数据效果很好。

POJO 类:

public class Test {
    
    @MongoId(FieldType.OBJECT_ID)
    private String id;
    private String name;
    
    public Test() {
    }
    public Test(String s) {
        super();
        this.name = s;
    }
    
    // get, set methods
    
    public String toString( ) {
        return id + " - " + name;
    }
}

来自Spring的CommandLineRunner.run()

    // Insert a document into the database
    Test t1 = new Test("alpha");
    t1 = mt.insert(t1);
    System.out.println(t1); // 61e7de9f5aadc2077d9f4a58 - alpha

    // Query from the database using the _id
    ObjectId id = new ObjectId("61e7de9f5aadc2077d9f4a58");
    Test t2 = mt.findById(id, Test.class);
    System.out.println(t2);

请注意,您需要在运行代码的类中执行此操作:

@Autowired private MongoTemplate mt;

您可以在我们的 POJO 类中使用 @MongoId@Id 注释来表示 MongoDB _id 字段。字段的类型可以是StringObjectId。这取决于你如何定义。

请参阅 Spring Data MongoDB 文档中的 如何在映射层中处理 _id 字段:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多