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的类型映射即可解决问题,步骤如下:
- 修改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); }
- 调整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方法 }
- 同步参数类型
确保updateCustomer方法中传入的Customer对象的id为String类型,此时调用customerRepository.findById(customer.getId())就能正常匹配MongoDB中的ID,无需额外转换。
修改完成后,Spring Data MongoDB提供的内置findById()方法就能直接适配String类型的ID,无需自行重写实现。
内容的提问来源于stack exchange,提问作者Noel Fockstedt
相关产品推荐
相关产品推荐

