You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+MongoDB REST API:findById()参数类型不匹配问题

问题描述

我正在学习使用Java Spring与MongoDB构建REST API,实现Customer对象的简易CRUD功能。目前其他功能运行正常,但findById()方法存在问题:MongoDB自动生成的_id为String类型,而内置findById()方法要求传入Long类型参数,且因ID包含字母无法转换为Long。

相关代码如下:

更新方法代码

public void updateCustomer(Customer customer) {
        System.out.println(customer.getId());
        Customer foundObject = customerRepository.findById(customer.getId())
                .orElseThrow(() -> new RuntimeException("Customer not found"));
        foundObject.setFirstName(customer.getFirstName());
        foundObject.setLastName(customer.getLastName());
        foundObject.setEmail(customer.getEmail());
        foundObject.setPhone(customer.getPhone());
        foundObject.setPassword(customer.getPassword());
        foundObject.setAddress(customer.getAddress());
        customerRepository.save(foundObject);
    }

Repository代码

package com.test.test.repository;

import com.test.test.model.Customer;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.Optional;

public interface CustomerRepository extends MongoRepository<Customer, Long> {
    @Query("{'firstName': ?0}")
    Optional<Customer> findByFirstName(String name);
}

请问我是否需要自行实现findById()方法?


解决方案

不需要自行实现findById()方法,只需要调整ID的类型映射即可解决问题,步骤如下:

  1. 修改Repository泛型类型
    把CustomerRepository继承MongoRepository时的泛型从Long改为String——MongoDB默认生成的_id是ObjectId类型,在Java中用String映射更适配:
public interface CustomerRepository extends MongoRepository<Customer, String> {
    @Query("{'firstName': ?0}")
    Optional<Customer> findByFirstName(String name);
}
  1. 调整Customer实体类的ID字段类型
    确保Customer类中的id字段类型为String,并添加@Id注解让Spring Data MongoDB自动映射MongoDB的_id字段:
import org.springframework.data.annotation.Id;

public class Customer {
    @Id
    private String id;
    // 其他字段
    private String firstName;
    private String lastName;
    private String email;
    private String phone;
    private String password;
    private String address;
    
    // 对应的getter/setter方法
}
  1. 同步参数类型
    确保updateCustomer方法中传入的Customer对象的id为String类型,此时调用customerRepository.findById(customer.getId())就能正常匹配MongoDB中的ID,无需额外转换。

修改完成后,Spring Data MongoDB提供的内置findById()方法就能直接适配String类型的ID,无需自行重写实现。


内容的提问来源于stack exchange,提问作者Noel Fockstedt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:23:27