web-dev-qa-db-ja.com

Spring MVC 415サポートされていないメディアタイプ

私は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");
                }
            });
        }
    });

そして、私が投稿している配列のオブジェクトの1つの例は次の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

なぜこのエラーが発生しているのですか?

14
jackyesind

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";
    }
8
muthu

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ステータスコードの問題が解決するはずです。

5
Swapneel

Jacksonとjackson-databindをクラスパスに追加する必要があります。春はそれを使用してそれをピックアップします MappingJacksonHttpMessageConverter

MappingJacksonHttpMessageConverter

JacksonのObjectMapperを使用してJSONを読み書きできるHttpMessageConverter実装。 JSONマッピングは、ジャクソンが提供する注釈を使用して、必要に応じてカスタマイズできます。さらに制御が必要な場合、特定の型に対してカスタムJSONシリアライザー/デシリアライザーを提供する必要がある場合に、ObjectMapperプロパティを介してカスタムObjectMapperを挿入できます。デフォルトでは、このコンバーターは(application/json)をサポートします。

3
Bart

私はconsume="application/json"私のリクエストマッピング設定では、json入力を期待しています。 JSON入力ではないリクエストを送信したとき、Springは415 Unsupported Media Typeについて不平を言いました。したがって、consume="application/json"私のために働いた。そのため、Springコントローラーのメソッドシグネチャのリクエスト入力とacceptメディアタイプを調べてください。不一致は415エラーをスローします。これが問題の原因である可能性が最も高いでしょう。

1
Lucky

同じ問題がありました。この問題を解決するには、次の手順に従う必要がありました。

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

。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>

これが誰かに役立つことを願っています。

0
Manoj Shrestha

私は同じ問題を抱えていました。spring-servlet.xmlに次のコード行を追加しました。これはこのxmlファイルのほぼ最後にありました。動いた。 <mvc:annotation-driven />

0
Jitendra Tumulu

データ型のjsonapplication/jsonに変更してみてください。そして、あなたのjsonはどのように見えますか 有効 ? jsonがString []に変換されるのを見たことがないので、この問題も問題です。

0
NimChimpsky