SpringBoot REST API如何无需定义实体类直接返回MongoDB存储的完整原始JSON
Spring Boot 直接返回MongoDB原始JSON的实现方案
以下两种方案都可以完全避免维护上百字段的实体类,MongoDB文档结构迭代时无需修改业务代码:
方案1:使用原生Document类型接收查询结果(推荐)
Spring Data MongoDB原生支持org.bson.Document类型作为查询返回值,该类型是MongoDB文档的映射结构,本质为键值对集合,Spring MVC会自动将其序列化为和存储结构完全一致的JSON返回给客户端。
- 如果使用
MongoTemplate做查询,示例代码如下:
import org.bson.Document; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Repository; @Repository public class TicketDao { private final MongoTemplate mongoTemplate; public TicketDao(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } public Document queryFullTicket(String ticketId) { Query query = Query.query(Criteria.where("ticketId").is(ticketId)); // 不需要指定自定义实体类,直接返回Document,默认携带所有字段 return mongoTemplate.findOne(query, Document.class, "你的票据集合名"); } }
- 如果使用
MongoRepository做查询,直接将泛型替换为Document即可:
import org.bson.Document; import org.springframework.data.mongodb.repository.MongoRepository; public interface TicketRepository extends MongoRepository<Document, String> { Document findByTicketId(String ticketId); }
- Controller层直接返回
Document即可:
import org.bson.Document; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/ticket") public class TicketController { private final TicketDao ticketDao; public TicketController(TicketDao ticketDao) { this.ticketDao = ticketDao; } @GetMapping("/{ticketId}") public ResponseEntity<Document> getFullTicket(@PathVariable String ticketId) { Document ticket = ticketDao.queryFullTicket(ticketId); return ticket == null ? ResponseEntity.notFound().build() : ResponseEntity.ok(ticket); } }
方案2:直接返回JSON字符串(适合需要自定义调整JSON的场景)
如果需要对返回内容做简单的字段过滤、增减,可以先拿到Document后转成原生JSON字符串,再指定响应类型直接返回:
@GetMapping(value = "/{ticketId}", produces = "application/json") public ResponseEntity<String> getRawTicket(@PathVariable String ticketId) { Document ticket = ticketDao.queryFullTicket(ticketId); if (ticket == null) { return ResponseEntity.notFound().build(); } // 可在此处对document做任意字段修改/删除后再转JSON String rawJson = ticket.toJson(); return ResponseEntity.ok(rawJson); }
注意事项
- 如果不需要返回MongoDB内置的
_id字段,构造查询时添加字段排除规则即可:query.fields().exclude("_id"),无需修改其他逻辑。 - 以上方案和原有部分字段返回的接口可以共存,不会影响旧业务逻辑。
- 做字段权限控制时直接调用
document.remove("敏感字段名")即可删除对应字段,比实体类操作更灵活。
内容的提问来源于stack exchange,提问作者Albert.us
相关产品推荐
相关产品推荐

