SpringBoot集成MongoDB插入数据报readStartDocument类BSON错误如何解决
问题根因
报错的直接原因是MongoDB在处理数据时,预期读取BSON文档类型,实际拿到的是字符串类型,触发类型校验失败。结合你的代码,有4个核心问题导致该错误:
- Role类不符合MongoDB序列化规则:缺少无参构造方法,构造参数未正确赋值给成员变量,自定义类没有正确的序列化配置,导致转换BSON时类型异常。
- User的role字段赋值错误:UserService中
user.role = user.role是无效赋值,没有将传入的Role参数封装为Set存入字段;同时你的Repository方法名existByEmail不符合Spring Data命名规范(正确前缀为exists),若自定义了@Query注解还可能存在语法错误,导致查询语句被解析为字符串。 - Controller参数注解使用错误:
@ModelAttribute默认接收表单参数,若Postman发送JSON请求会导致参数解析异常,字段赋值错误。 - Profile类(你未贴出代码)如果也是自定义类,同样可能存在序列化配置缺失的问题。
解决方案
按以下步骤依次修正即可解决:
1. 修正Role类定义
推荐直接改为枚举类,MongoDB原生支持枚举序列化,无需额外配置:
package com.nilmani.mychat.model enum class Role { USER, FACEBOOK_USER }
如果要保留原有类写法,修正为符合序列化要求的格式:
package com.nilmani.mychat.model import org.springframework.data.mongodb.core.mapping.Document @Document class Role { var name: String? = null // 提供带参构造 constructor(name: String) { this.name = name } // 必须提供无参构造供MongoDB序列化使用 constructor() companion object { val USER = Role("USER") val FACEBOOK_USER = Role("FACEBOOK_USER") } }
2. 修正UserService与Repository代码
- 首先修正UserRepository中的查询方法名,符合Spring Data命名规范,无需额外添加@Query注解即可自动生成正确查询:
// 把原来的existByEmail改为existsByEmail fun existsByEmail(email: String): Boolean fun existsByUserName(userName: String): Boolean
- 修正UserService中role字段的赋值逻辑:
把原来的无效赋值user.role = user.role改为:
user.role = setOf(role)
3. 修正Controller参数注解
如果接口接收JSON格式请求,把@ModelAttribute改为@RequestBody:
@PostMapping(value = ["/users"], produces = [MediaType.APPLICATION_JSON_VALUE]) fun createUser(@RequestBody request: Signup): ResponseEntity<*> { // 原有业务逻辑保持不变 }
Postman调用时选择Body→raw→JSON,传入符合Signup结构的JSON参数即可。
4. 补充Profile类序列化配置
如果Profile类也是自定义普通类,同样添加无参构造,需要的话加上@Document或@Embedded注解,保证MongoDB可以正确序列化。
内容的提问来源于stack exchange,提问作者Mama
相关产品推荐
相关产品推荐

