JUnit测试POST请求时遭遇InvalidMediaTypeException问题排查
解决Spring JUnit POST测试中的
org.springframework.http.InvalidMediaTypeException问题 从你的描述来看,这个异常主要源于两个核心问题,咱们一步步拆解分析:
1. JSON请求体的字段类型不匹配
你预期的JSON里,nAccountId、nAccountCPCMappingid、nDeptId、nInvestigatorId这些字段都是数值类型,但你手动拼接字符串时给它们加了双引号,把数值转成了字符串类型:
// 错误示例:数字字段被错误包裹为字符串 String json = "{\n" + " \"nAccountId\":\"651754\", ...";
这种格式不符合接口预期的JSON结构,Spring无法正确解析请求体,进而触发媒体类型相关的异常。
2. (潜在问题)请求头未正确声明Content-Type
如果你的测试代码没有显式设置请求的Content-Type为application/json,Spring也会无法识别请求体的媒体类型,同样会抛出这个异常。
修复方案
方案一:手动修正JSON字符串(不推荐,易出错)
把数字字段的双引号去掉,确保JSON结构和预期完全一致:
String json = "{\n" + " \"nAccountId\":651754,\n" + " \"sLocation\": \"B\",\n" + " \"nAccountCPCMappingid\":8,\n" + " \"sAcctDesc\":\" FY07 GEN GIFTS\",\n" + " \"nDeptId\":21728,\n" + " \"sClientAcctId\":\"2100012\",\n" + " \"nInvestigatorId\":65760\n" + "}";
方案二:用Jackson的ObjectMapper构造JSON(推荐,更可靠)
手动拼接JSON很容易因疏漏出错,建议用Jackson序列化Java对象来生成正确的JSON:
- 先创建与预期JSON结构对应的实体类:
public class AccountRequest { private Long nAccountId; private String sLocation; private Long nAccountCPCMappingid; private String sAcctDesc; private Long nDeptId; private String sClientAcctId; private Long nInvestigatorId; // 生成getter、setter,或者使用Lombok的@Data注解简化代码 }
- 在测试代码中构造对象并序列化:
AccountRequest request = new AccountRequest(); request.setNAccountId(651754L); request.setSLocation("B"); request.setNAccountCPCMappingid(8L); request.setSAcctDesc(" FY07 GEN GIFTS"); request.setNDeptId(21728L); request.setSClientAcctId("2100012"); request.setNInvestigatorId(65760L); ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(request);
方案三:确保测试请求设置正确的Content-Type
发送POST请求时,必须显式指定请求头的Content-Type为application/json,比如使用Spring MockMvc测试的写法:
mockMvc.perform(post("/your-target-api-endpoint") .contentType(MediaType.APPLICATION_JSON) .content(json)) .andExpect(status().isOk());
按照上面的方式调整后,就能解决InvalidMediaTypeException的问题了。
内容的提问来源于stack exchange,提问作者SpringUser
相关产品推荐
相关产品推荐

