web-dev-qa-db-ja.com

POST JSONが415 Unsupported media type、Spring 3 mvcで失敗する

サーブレットにPOST要求を送信しようとしています。このようにしてリクエストはjQuery経由で送信されます。

var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);

newCategoryはどこにありますか

function newCategory(productCategory)
{
  $.postJSON("ajax/newproductcategory", productCategory, function(
      idProductCategory)
  {
    console.debug("Inserted: " + idProductCategory);
  });
}

そしてpostJSONは

$.postJSON = function(url, data, callback) {
    return jQuery.ajax({
    'type': 'POST',
    'url': url,
    'contentType': 'application/json',
    'data': JSON.stringify(data),
    'dataType': 'json',
    'success': callback
    });
};

Firebugでは、JSONが正しく送信されていることがわかります。

{"idProductCategory":1,"description":"Descrizione2"}

しかし私は415 Unsupportedメディアタイプを取得します。春のmvcコントローラーに署名があります

    @RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
        @RequestBody ProductCategory productCategory)

数日前にはうまくいったが、今はそうではない。必要に応じてもっとコードを見せます。ありがとう

156
gc5

私はそれを機能させる方法を管理しました。私が間違っている場合に備えて教えてください。シリアライズ/デシリアライズする方法は1つだけでした。これに関するすべてのアノテーション(@JSONSerialize@JSONDeserialize)を削除し、シリアライザとデシリアライザをCustomObjectMapperクラスに登録しました。この動作を説明する記事は見つかりませんでしたが、この方法で解決しました。それが役に立つことを願っています。

3
gc5

私はこれをSpring @ResponseBodyで以前に起こしました、そしてそれは要求と共に送られたacceptヘッダーがなかったからでした。 Accept headerはjQueryで設定するのが面倒かもしれませんが、これは私にとってはうまくいきました source

$.postJSON = function(url, data, callback) {
    return jQuery.ajax({
    headers: { 
        'Accept': 'application/json',
        'Content-Type': 'application/json' 
    },
    'type': 'POST',
    'url': url,
    'data': JSON.stringify(data),
    'dataType': 'json',
    'success': callback
    });
};

Content-Typeヘッダーは、リクエストでクライアントから送信されているデータのフォーマットを決定するために@RequestBodyによって使用されます。 acceptヘッダーは@ResponseBodyによって使用され、応答でデータをクライアントに返送するフォーマットを決定します。そのため、両方のヘッダーが必要です。

228
theon

私は同様の問題を抱えていましたが、問題は@RequestBodyのアノテーションが付けられたDTO用のデフォルトコンストラクタを提供することを怠っていたことです。

18
John Shepherd

application/jsonとしてコンテンツタイプをリクエストに追加することで問題が解決しました

16
uiroshan

私は全く同じ問題に出くわしたと思います。 JSON、JavaScript、およびServerとの無数の戦いの後、私は犯人を見つけました。私の場合はDTOにDateオブジェクトがありましたが、このDateオブジェクトはStringに変換されています。フォーマット:HH:mm.

JSON情報が送り返されていたとき、このDate Stringオブジェクトは完全なDate Objectに変換し直さなければならなかったので、DTOでそれを設定するためのメソッドも必要です。大きな問題は、DTOに2つのメソッド(オーバーロード)を持つことができないということです。これは、415 Unsupported Media typeエラーも発生するためです。

これは私のコントローラーメソッドでした

  @RequestMapping(value = "/alarmdownload/update", produces = "application/json", method = RequestMethod.POST)
  public @ResponseBody
  StatusResponse update(@RequestBody AlarmDownloadDTO[] rowList) {
    System.out.println("hola");
    return new StatusResponse();
  }

これは私のDTOの例でした(id get/setおよびpreAlarm getメソッドはコードが短くなるため含まれていません)。

@JsonIgnoreProperties(ignoreUnknown = true)
public class AlarmDownloadDTO implements Serializable {

  private static final SimpleDateFormat formatHHmm = new SimpleDateFormat("HH:mm");

  private String id;
  private Date preAlarm;

  public void setPreAlarm(Date date) { 
    this.preAlarm == date;
  }
  public void setPreAlarm(String date) {    
    try {
      this.preAlarm = formatHHmm.parse(date);
    } catch (ParseException e) {
      this.preAlarm = null;
    } catch (NullPointerException e){
      this.preAlarm = null;
    }
  }
}

すべてがうまくいくようにするには、Date型パラメータを持つメソッドを削除する必要があります。このエラーは非常にイライラするものです。これが誰かのデバッグ時間を節約できることを願っています。

11
will824

私は同様の問題に直面しました、そしてこれが私がそれを直した方法です、

問題は、JSONからJavaへの変換プロセスによるものです。変換を正しく実行するには、適切なランタイムJacksonライブラリが必要です。

次のjarファイルを(依存関係を通じて、またはダウンロードしてクラスパスに追加することによって)追加します。

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>

これで問題は解決するはずです。

完全なコード:

function() {
  $.ajax({
    type: "POST",
    url: "saveUserDetails.do",
    data: JSON.stringify({
      name: "Gerry",
      ity: "Sydney"
    }),
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    success: function(data) {
      if (data.status == 'OK')
        alert('Person has been added');
      else
        alert('Failed adding person: ' + data.status + ', ' + data.errorMessage);
}

コントローラのシグネチャは次のようになります。

@RequestMapping(value = "/saveUserDetails.do", method = RequestMethod.POST)
public @ResponseBody Person addPerson( @RequestBody final  Person person) {

お役に立てれば

9
vinSan

私は春のブーツと春のmvcを統合したとき私はこの問題に直面しました。これらの依存関係を追加するだけで解決しました。

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
8
deep

ちょっとしたメモ - Webアプリケーションの開発中にこれと同じエラーが発生しました。 Firefox Posterのサービスを利用することで見つけた間違いは、Jsonのフィールドと値の両方を二重引用符で囲む必要があることです。例えば..

[ {"idProductCategory" : "1" , "description":"Descrizione1"}, 
  {"idProductCategory" : "2" , "description":"Descrizione2"} ]

私たちの場合は、javascriptを使ってjsonを埋めました。これは、私が聞いたことから、一重引用符/二重引用符を扱うときには少々混乱します。

'Accept'や 'Content-Type'ヘッダを含め、これまでの記事や他の記事で述べたことも当てはまります。

期待しています。

5
Carlos Romero

私は同じ問題を抱えていました。問題を解決するために私はこれらのステップに従わなければなりませんでした:

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>

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

1
Manoj Shrestha

私はpomにjackson-jsonデータバインディングを追加することでこの問題を解決しました。

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.3</version>
</dependency>
0

春のブーツ+春のPVC

問題あり

@PostMapping("/addDonation")
public String addDonation(@RequestBody DonatorDTO donatorDTO) {

解決策あり

@RequestMapping(value = "/addDonation", method = RequestMethod.POST)
@ResponseBody
public GenericResponse addDonation(final DonatorDTO donatorDTO, final HttpServletRequest request){