使用RestAssuredMockMvc与Spring REST Docs时Content-Type头重复问题
RestAssuredMockMvc + Spring REST Docs Content-Type头重复问题解答
问题背景
使用RestAssuredMockMvc结合Spring REST Docs编写测试用例时,在全局测试配置中通过headers()方法设置了AUTHORIZATION、ACCEPT及Content-Type: application/json请求头,但生成的http-request.adoc文档中出现两个相同的Content-Type: application/json头。经调试发现,Spring的MockHttpServletRequest中Content-Type头已被重复设置(早于文档处理环节),取消注释modifyHeaders().set(...)代码可消除重复。查看MockHttpServletRequest#addHeader逻辑后,了解到该方法允许添加重复头,但两者结合时引发文档展示异常。
1. 此重复现象是否为两者结合时的预期行为?
不是预期行为,但属于组件特性叠加导致的场景问题:
- RestAssuredMockMvc通过
headers()配置头时,内部调用的是addHeader逻辑,会追加头而非覆盖; - Spring的
MockHttpServletRequest本身允许同名请求头重复存在(符合Servlet规范); - 同时,当请求体为JSON格式时,RestAssured或Spring MockMvc内部可能自动添加
Content-Type: application/json头,和手动配置的头叠加后就出现了重复。
2. 有无更优雅的方式避免Content-Type头重复添加?
推荐以下几种更简洁的方案:
- 依赖自动配置,不手动添加:如果请求体是JSON格式(比如用
body()传入JSON对象/字符串),RestAssured会自动添加Content-Type: application/json,无需手动配置,从根源避免重复; - 用
header()替代headers()批量设置:header("Content-Type", "application/json")会覆盖已存在的同名头,而headers()是追加逻辑,改用单个header()方法可避免重复; - 全局配置默认Content-Type:在RestAssured全局配置中设置默认的Content-Type,无需手动在请求头中添加:
RestAssuredMockMvc.config = RestAssuredMockMvc.config() .encoderConfig(encoderConfig().defaultContentContentType(ContentType.JSON)); - 文档生成环节去重:自定义Spring REST Docs的过滤器,在生成
http-request.adoc前对请求头进行去重,保留唯一的Content-Type项。
3. 该问题应由开发者、RestAssured还是Spring来处理?
- Spring:
MockHttpServletRequest允许重复头是符合Servlet规范的设计,无需修改; - RestAssured:可考虑在结合Spring MockMvc的场景中,对
Content-Type这类特殊头默认采用覆盖逻辑,属于优化方向,但并非必须修复的bug; - 开发者:最直接的解决路径是通过调整配置或请求写法规避(比如上述方案),因为这是组件特性叠加导致的场景问题,开发者可通过合理配置快速解决。
内容的提问来源于stack exchange,提问作者오태현
相关产品推荐
相关产品推荐

