15

我正在使用 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

为什么会发生此错误 - 有人知道吗?

4

7 回答 7

7

您可以尝试使用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";
    }
于 2013-08-08T06:37:47.927 回答
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 状态代码问题。

于 2016-08-11T10:51:46.397 回答
3

您需要将 jackson 和 jackson-databind 添加到类路径中。春天会用它捡起它MappingJacksonHttpMessageConverter

映射JacksonHttpMessageConverter

一个可以使用 Jackson 的 ObjectMapper 读写 JSON 的 HttpMessageConverter 实现。JSON 映射可以通过使用 Jackson 提供的注释根据需要进行自定义。当需要进一步控制时,可以通过 ObjectMapper 属性注入自定义 ObjectMapper,以应对需要为特定类型提供自定义 JSON 序列化器/反序列化器的情况。默认情况下,此转换器支持 (application/json)。

于 2013-08-07T12:53:36.163 回答
2

consume="application/json"的请求映射配置中有一个需要 json 输入的配置。当我发送一个不是 JSON 输入的请求时,Spring 抱怨 415 Unsupported Media Type。所以删除了consume="application/json"对我有用的东西。因此,请查看 Spring 控制器方法签名中的请求输入和接受媒体类型。不匹配会引发 415 错误。这很可能是问题的原因。

于 2016-03-21T11:25:16.793 回答
0

尝试更改jsonapplication/jsonfor 数据类型。你的 json 是什么样的,它是有效的吗?我以前从未见过 json 转换为 String[],所以这也可能是问题所在。

于 2013-08-07T11:42:38.307 回答
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>

我希望这对某人有用。

于 2016-03-16T04:16:38.527 回答
0

我有同样的问题,我只是在 spring-servlet.xml 中提出了下面的代码行,它几乎在这个 xml 文件的末尾。有效。 <mvc:annotation-driven />

于 2017-05-17T10:34:44.410 回答