向Spring Boot发送JSON数据时遭遇415 Unsupported MediaType错误求助
解决Spring Boot与React交互的415 Unsupported MediaType错误
向Spring Boot应用发送JSON数据时遇到415 Unsupported MediaType错误,以下是相关代码及错误信息:
React初始请求代码
const [job, setJob] = useState({ name: "", }); const handleChange = (event) => { setJob({...job, [event.target.name] : event.target.value}); } // ... fetch(SAVE_JOB_URL, { method: "POST", headers: { "Accept":"application/json", "ContentType":"application/json", "Authorization":sessionStorage.getItem("accessToken") }, body: new URLSearchParams({ "userId": sessionStorage.getItem("userId"), "job": JSON.stringify(job), }) }) .then((response) => response.json()) .then((responseData) => { console.log(JSON.stringify(responseData)) }) .catch(error => console.error(error));
Spring Boot接收代码
@PostMapping("/job/save", consumes = [APPLICATION_JSON_VALUE]) fun saveJob(@RequestBody form: JobSaveForm): ResponseEntity<Job> { form.job.createdBy = userService.getUser(form.userId) val uri: URI = URI.create(ServletUriComponentsBuilder.fromCurrentContextPath().path("/api/job/save").toUriString()) return ResponseEntity.created(uri).body(jobService.saveJob(form.job)) } data class JobSaveForm( val userId: Long, val job: Job, )
错误日志
2022-09-06 23:17:52.843 DEBUG 14776 --- [nio-8102-exec-8] o.s.web.servlet.DispatcherServlet : POST "/api/job/save", parameters={masked} 2022-09-06 23:17:52.845 WARN 14776 --- [nio-8102-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported] 2022-09-06 23:17:52.845 DEBUG 14776 --- [nio-8102-exec-8] o.s.web.servlet.DispatcherServlet : Completed 415 UNSUPPORTED_MEDIA_TYPE 2022-09-06 23:17:52.846 DEBUG 14776 --- [nio-8102-exec-8] o.s.web.servlet.DispatcherServlet : "ERROR" dispatch for POST "/error", parameters={masked} 2022-09-06 23:17:52.847 DEBUG 14776 --- [nio-8102-exec-8] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest) 2022-09-06 23:17:52.850 DEBUG 14776 --- [nio-8102-exec-8] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using 'application/json', given [application/json] and supported [application/json, application/*+json, application/json, application/*+json] 2022-09-06 23:17:52.852 DEBUG 14776 --- [nio-8102-exec-8] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [{timestamp=Tue Sep 06 23:17:52 BST 2022, status=415, error=Unsupported Media Type, trace=org.springf (truncated)...] 2022-09-06 23:17:52.853 DEBUG 14776 --- [nio-8102-exec-8] o.s.web.servlet.DispatcherServlet : Exiting from "ERROR" dispatch, status 415
尝试修改React代码后,内容类型变为text/plain,仍报错:
fetch(SAVE_JOB_URL, { method: "POST", headers: { "Accept":"application/json", "ContentType":"application/json", "Authorization":sessionStorage.getItem("accessToken") }, body: JSON.stringify({ "userId":sessionStorage.getItem("userId"), "job": job }) }) .then((response) => response.json()) .then((responseData) => { console.log(JSON.stringify(responseData)) }) .catch(error => console.error(error));
问题分析与解决方案
- 初始错误原因:使用
new URLSearchParams()构造请求体,默认会将请求内容类型设为application/x-www-form-urlencoded,但后端接口明确指定只接受application/json,因此触发415错误。 - 修改后仍报错原因:请求头中
ContentType拼写错误,正确的HTTP头字段名应为Content-Type(注意连字符,而非驼峰写法)。浏览器无法识别错误的头字段,会默认将请求内容类型设为text/plain,导致后端仍无法解析。
正确的React请求代码
fetch(SAVE_JOB_URL, { method: "POST", headers: { "Accept": "application/json", "Content-Type": "application/json", // 修正字段名 "Authorization": sessionStorage.getItem("accessToken") }, body: JSON.stringify({ "userId": parseInt(sessionStorage.getItem("userId")), // 转换为数字类型匹配后端Long "job": job }) }) .then((response) => response.json()) .then((responseData) => { console.log(JSON.stringify(responseData)) }) .catch(error => console.error(error));
额外注意事项
- 确保
userId从sessionStorage获取后转换为数字类型,因为后端JobSaveForm中userId定义为Long,若存储的是字符串会导致JSON解析失败。 - 确认前端
job对象的字段与后端Job类的字段完全匹配,避免字段不对应引发解析错误。
内容的提问来源于stack exchange,提问作者JamieRhys
相关产品推荐
相关产品推荐

