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

Docker化Django与Spring Boot服务间HTTP 400错误排查求助

问题分析与解决方案

问题根源

从Spring Boot日志可见,当请求内容过大时,DispatcherServlet输出parameters={},说明请求的表单参数未被正确解析。这是因为Spring Boot默认使用的Tomcat容器,对application/x-www-form-urlencoded格式的POST请求有默认大小限制(默认值通常为2MB~10MB),当请求体超过该限制时,Tomcat会直接拒绝解析整个表单,导致所有@RequestParam参数无法被获取,最终抛出MissingServletRequestParameterException错误。


解决方案

方案1:调整Spring Boot容器的表单大小限制

通过配置文件增大Tomcat对表单请求的大小限制,同时调整multipart相关配置(若后续涉及文件上传):

application.properties 配置

# 设置表单POST请求的最大大小(示例为100MB,可按需调整)
server.tomcat.max-http-form-post-size=104857600
# 配置multipart请求的最大文件/请求大小(若使用multipart格式提交)
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB

application.yml 配置

server:
  tomcat:
    max-http-form-post-size: 104857600 # 100MB,单位为字节
spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

方案2:改用JSON格式提交请求(推荐)

application/x-www-form-urlencoded格式并不适合传输大量结构化数据,改用JSON请求体更高效,且能彻底规避表单大小限制问题:

Django侧代码修改

import requests

# 直接构造原始Python字典,无需手动序列化JSON
payload = {
    'document-json-dump': data,
    'doc_req_res_params': res_paths,
    'doc_req_params': params_data
}

res = requests.post(
    f'http://{spring_host}:8080/getTranslatedAsFile/',
    json=payload  # requests会自动设置Content-Type为application/json并完成序列化
)

Spring Boot侧代码修改

  1. 创建统一的请求DTO类:
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
public class TranslationRequest {
    @JsonProperty("document-json-dump")
    private Document document;
    
    @JsonProperty("doc_req_res_params")
    private DocumentReqResourceParameters docReqResParams;
    
    @JsonProperty("doc_req_params")
    private DocumentReqParameters docReqParams;
}
  1. 修改控制器方法:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@PostMapping(value = "/getTranslatedAsFile/")
public String getTranslatedAsFile(@RequestBody TranslationRequest request) {
    // 直接使用DTO中的对象,无需手动重复反序列化
    return documentProcessService.translate(
        request.getDocReqParams(),
        request.getDocReqResParams(),
        request.getDocument()
    );
}

这种方式不仅解决了大请求问题,还简化了代码逻辑,符合RESTful接口设计规范。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:09:27