上传接口与文档主记录创建
这篇文档要讲的是:用户上传一份文档后,后端到底做了哪些事情?从 Controller 接到请求开始,一直到最后把消息丢进 Kafka 队列,整条链路我们一步步拆开来看。
先上一张总览流程图,有个整体印象之后再逐段看源码。
上传链路总览
Controller 层:接收 multipart 请求
上传接口的入口在 DocumentManageController,它是一个标准的 Spring MVC 控制器。这个接口比较特殊——不是普通的 JSON 请求,而是 multipart/form-data,同时包含二进制文件和文档元信息两部分。
/**
* 上传文档并投递后续解析任务。
* <p>
* 请求体采用 multipart/form-data,通常包含两部分:
* 1. {@code file}:真实上传的文档二进制内容;
* 2. {@code meta}:可选的文档元信息,例如展示名称、知识范围、业务分类、操作人等。
* </p>
* <p>
* 控制器本身不直接处理文件落盘、对象存储、文档入库或任务投递,
* 这里只负责把 multipart 中的两部分正确绑定出来,然后交给服务层统一完成:
* 文件校验、文件类型识别、对象存储上传、文档主表写入、任务表写入、日志记录和 Kafka 投递。
* </p>
*
* @param file 上传的文档文件,必须通过 multipart 的 {@code file} 字段传入
* @param dto 上传附带的文档元信息,来自 multipart 的 {@code meta} 字段,可为空
* @return 上传结果,包含文档 ID、任务 ID 以及当前解析/策略/索引状态
*/
@Operation(summary = "上传文档并投递解析任务")
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ApiResponse<DocumentUploadVo> upload(@RequestPart("file") MultipartFile file,
@Valid @RequestPart(value = "meta", required = false) DocumentUploadDto dto) {
// meta 允许前端不传;这里统一兜底成一个空 DTO,避免服务层重复判空,让后续取字段时更稳定。
return ApiResponse.ok(documentManageService.upload(file, dto == null ? new DocumentUploadDto() : dto));
}
这段代码的要点:
- 用
@RequestPart("file")接收上传的文件二进制内容,用@RequestPart("meta")接收可选的元信息 JSON meta标记了required = false,前端可以不传。Controller 这里做了一个兜底:如果dto为 null,就 new 一个空的DocumentUploadDto,这样服务层就不用到处判空了- Controller 本身不做任何业务逻辑,纯粹是参数绑定 + 转发给 Service
关于 DocumentUploadDto
DocumentUploadDto 是上传时可选的元信息,包含以下字段:
documentName:文档展示名称(不传则用原始文件名)operatorId:操作人 ID(不传则视为系统触发)knowledgeScopeCode/knowledgeScopeName:知识范围编码和名称businessCategory:业务分类documentTags:文档标签
Service 层:upload 方法全流程
接下来就是核心了——DocumentManageServiceImpl.upload() 方法。这个方法没有在方法级别加 @Transactional 注解,而是通过 TransactionTemplate 手动控制事务边界:数据库写入操作(文档主表、任务表、任务日志)放在 transactionTemplate.execute() 内部,事务提交成功后再发送 Kafka 消息。这样做的目的是避免"消息已发出但事务还没提交"的时间窗口问题。
我们按执行顺序,一段一段来看。
付费内容提示
该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放
加入星球后,你可以获得:
- 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
- 讲解文档:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的详细文档
- 讲解视频:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
- 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
- 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
- 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
- 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
- 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
- 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
