我正在使用Spring 3.2并尝试使用ajax post请求来提交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
为什么会发生这种错误 - 有人知道吗?
答案 0 :(得分:8)
您可以尝试使用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";
}
答案 1 :(得分:5)
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状态代码问题。
答案 2 :(得分:3)
您需要将jackson和jackson-databind添加到类路径中。 Spring将使用它MappingJacksonHttpMessageConverter
一个HttpMessageConverter实现,可以使用Jackson的ObjectMapper读写JSON。通过使用Jackson提供的注释,可以根据需要自定义JSON映射。当需要进一步控制时,可以通过ObjectMapper属性注入自定义ObjectMapper,以用于需要为特定类型提供自定义JSON序列化器/反序列化器的情况。默认情况下,此转换器支持(application / json)。
答案 3 :(得分:1)
我的请求映射配置中有consume="application/json"
,需要json输入。当我发送一个不是JSON输入的请求时,Spring抱怨415 Unsupported Media Type。所以删除consume="application/json"
为我工作。因此,请查看Spring控制器方法签名中的请求输入和接受媒体类型。不匹配会引发415错误。这很可能是问题的原因。
答案 4 :(得分:0)
尝试将json
更改为application/json
以获取数据类型。你的json是什么样的valid?我之前从未见过json转换为String [],所以这也可能是问题所在。
答案 5 :(得分:0)
我遇到了同样的问题。我必须按照以下步骤解决问题:
<强> 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>
我希望这对某人有用。
答案 6 :(得分:0)
我遇到了同样的问题,我刚刚在spring-servlet.xml中提出了以下代码行,它几乎就在这个xml文件的末尾。有效。
<mvc:annotation-driven />