Spring MVC 415 不支持的媒体类型
Posted
技术标签:
【中文标题】Spring MVC 415 不支持的媒体类型【英文标题】:Spring MVC 415 Unsupported Media Type 【发布时间】:2013-08-08 18:35:13 【问题描述】:我正在使用 Spring 3.2 并尝试使用 ajax 发布请求来提交 json 对象数组。如果这是相关的,我转义了所有特殊字符。
我的 HTTP 状态为 415。
我的控制器是:
@RequestMapping(value = "/save-profile", method = RequestMethod.POST,consumes="application/json")
public @ResponseBody String saveProfileJson(@RequestBody String[] profileCheckedValues)
System.out.println(profileCheckedValues.length);
return "success";
jquery 是:
jQuery("#save").click(function ()
var profileCheckedValues = [];
jQuery.each(jQuery(".jsonCheck:checked"), function ()
profileCheckedValues.push($(this).val());
);
if (profileCheckedValues.length != 0)
jQuery("body").addClass("loading");
jQuery.ajax(
type: "POST",
contentType: "application/json",
url: contextPath + "/sample/save-profile",
data: "profileCheckedValues="+escape(profileCheckedValues),
dataType: 'json',
timeout: 600000,
success: function (data)
jQuery('body').removeClass("loading");
,
error: function (e)
console.log("ERROR: ", e);
jQuery('body').removeClass("loading");
);
);
我发布的数组中的一个对象的示例是以下 json:
"id": "534213341",
"name": "Jack Lindamood",
"first_name": "Jack",
"last_name": "Lindamood",
"link": "https://www.facebook.com/jack",
"username": "jack",
"gender": "male",
"locale": "en_US",
"updated_time": "2013-07-23T21:13:23+0000"
错误是:
The server refused this request because the request entity is in a format not supported by the requested resource for the requested method
为什么会发生这个错误 - 有人知道吗?
【问题讨论】:
类路径中有jackson吗? 是的,我已经包含了 jackson-core 2.0.6 这不是一个值数组,而是一个值映射。 这是一个单一的元素。 那是什么意思?您是否期望上述 JSON 的数组?喜欢多个用户的个人资料?您的 HTTP 请求中的名称“profileCheckedValues”在哪里?啊,这是您的错误:即使您将 contentType 设置为,您也没有发送 application/json 。您正在发送一个名为“profileCheckedValues”的参数 which content 是 JSON(我猜)。但是 HTTP 请求本身不是 JSON;删除该行以使 jQuery 使用默认的“application/x-www-form-urlencoded”。这样,您的控制器将获得 JSON,而不会被 Spring 转换。 【参考方案1】:尝试将数据类型的 json
更改为 application/json
。你的 json 是什么样的,是 valid 吗?我以前从未见过 json 转换为 String[],所以这也可能是问题所在。
【讨论】:
有没有可能将json数组发送到spring控制器 当我签入萤火虫时,参数具有有效的 json。在java方面我将如何获得datatype
是服务器发回的内容。另外,它没有格式化为 MIME 类型,而是由 jQuery 定义的。【参考方案2】:
您需要将 jackson 和 jackson-databind 添加到类路径中。 Spring 将使用它的MappingJacksonHttpMessageConverter
MappingJacksonHttpMessageConverter
可以使用 Jackson 的 ObjectMapper 读写 JSON 的 HttpMessageConverter 实现。 JSON 映射可以通过使用 Jackson 提供的注释根据需要进行自定义。当需要进一步控制时,可以通过 ObjectMapper 属性注入自定义 ObjectMapper,以应对需要为特定类型提供自定义 JSON 序列化器/反序列化器的情况。默认情况下,此转换器支持 (application/json)。
【讨论】:
我已经包含了 jackson-core-2.0.6.jar。public @ResponseBody String saveProfileJson(@RequestBody String[] profileCheckedValues)
而不是字符串我会给什么我没有那个 json 的对象
您可能还需要添加 jackson-databind 包【参考方案3】:
你可以试试HttpServletRequest
。它没有任何问题
@RequestMapping(value = "/save-profile", method = RequestMethod.POST,consumes="application/json",headers = "content-type=application/x-www-form-urlencoded")
public @ResponseBody String saveProfileJson(HttpServletRequest request)
System.out.println(request.getParameter("profileCheckedValues"));
return "success";
【讨论】:
@RequestParam
也可以。同样在 jQuery 调用中,删除设置 contentType
: 发送一个名称为 profileCheckedValues
的数组(发生来保存 JSON 字符串,但可能是任何东西)不是 application/json
而是简单默认application/x-www-form-urlencoded
。
对于数组,使用getParameterValues
。
再说一次,@jackyesind,“它不起作用” 是什么意思? (你看到了什么?你需要具体;你需要更详细。)另外,你试过getParameterValues
吗?还有@RequestParam
?请阅读Help Vampires: A Spotter’s Guide。我不再响应您的请求,但是:成功。
@Arjan。对不起。如果我使用 getParameterValues 意味着它只返回 null
你是怎么测试的,muthu?如果只有一个值,getParameterValues 应该返回与 getParameter 相同的值。但实际上这取决于 jQuery 如何创建请求。 @jackyesind 的问题中的 jQuery Ajax 请求也有错误。【参考方案4】:
我遇到了同样的问题。我必须按照以下步骤解决问题:
1.确保您具有以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>$jackson-version</version> // 2.4.3
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>$jackson-version</version> // 2.4.3
</dependency>
2。创建以下过滤器:
public class CORSFilter extends OncePerRequestFilter
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException
String origin = request.getHeader("origin");
origin = (origin == null || origin.equals("")) ? "null" : origin;
response.addHeader("Access-Control-Allow-Origin", origin);
response.addHeader("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, DELETE, OPTIONS");
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Allow-Headers",
"Authorization, origin, content-type, accept, x-requested-with");
filterChain.doFilter(request, response);
3.对 web.xml 中的请求应用上述过滤器
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>com.your.package.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我希望这对某人有用。
【讨论】:
【参考方案5】:我的请求映射配置中有 consume="application/json"
,它需要一个 json 输入。当我发送一个不是 JSON 输入的请求时,Spring 抱怨 415 Unsupported Media Type。所以删除 consume="application/json"
对我有用。因此,请查看 Spring 控制器方法签名中的请求输入和接受媒体类型。不匹配会引发 415 错误。这很可能是问题的原因。
【讨论】:
【参考方案6】:1) 添加以下依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>$jackson-version</version> // 2.4.3
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>$jackson-version</version> // 2.4.3
</dependency>
2) 如果您在控制器方法中使用 @RequestBody 注释,请确保您在 xml 文件中添加了以下内容
<mvc:annotation-driven />
这应该可以解决 415 状态码问题。
【讨论】:
我遇到了 415 问题,因为使用的是 codehaus 依赖而不是 fastxml。谢谢!像魅力一样工作【参考方案7】:我遇到了同样的问题,我只是在 spring-servlet.xml 中提出了下面的代码行,它几乎在这个 xml 文件的末尾。有效。
<mvc:annotation-driven />
【讨论】:
以上是关于Spring MVC 415 不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章
Spring,Angular.js 415 不支持的媒体类型错误
Spring RestTemplate 415 不支持的媒体类型
解决了! - Spring boot:获取 415 不支持的媒体类型
Spring Boot Actuator Shutdown Endpoint with Spring RestTemplate Client:错误 415 不支持的媒体类型