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

向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));

问题分析与解决方案

  1. 初始错误原因:使用new URLSearchParams()构造请求体,默认会将请求内容类型设为application/x-www-form-urlencoded,但后端接口明确指定只接受application/json,因此触发415错误。
  2. 修改后仍报错原因:请求头中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:55:23