web-dev-qa-db-ja.com

Spring REST @ RequestBodyは常に空です

そのため、「415メディアがサポートされていません」エラー( 415メディアがサポートされていません )を修正した後、新しい問題が発生しました。私のRequestBodyは常に空です。 Chrome PostManを介してリクエストを送信すると、常にnull値のみのシリアル化されたエンティティが返されます。プロジェクトでSpring (4.2.3.RELEASE)Jackson-databind (2.6.3)jackson-core (2.6.3)を使用しています。プロジェクトでアノテーションベースの構成を使用しています(@EnableWebMvcを使用して、Springが自動的にHTTPMessageConvertersを検出できるようにします)。


その他の投稿

私はスタックオーバーフローに関する他の投稿を知っていますが、ほぼ同じ問題があります。それでも彼らは私に答えを提供しませんでした。また、ほとんどの投稿は古いSpringバージョン(4.0より前)のものであるため、現在はまったく異なるものがいくつかあります。

同様の投稿:

@ RepsonseBodyはSpringでは常に空です

POSTで空の文字列を提供するSpringの@RequestBody

HttpServletRequestリクエストを使用


スプリングコントローラー

私の春には@RestController次のコードがあります。

@RequestMapping(value = "/location/update/{id}", method = RequestMethod.PUT)
public UserLocation updateUserLocation(@PathVariable("id") int id, UserLocation user) {        
        return user;        
}

データバインディングに別のモデルクラス(UserLocation)を使用しています。これは、この方法で、APIが送受信するデータをより細かく制御できるためです。


データバインディングクラス(UserLocation)

UserLocationクラスは、コンストラクターと必要なゲッターおよびセッターを備えた3つのプロパティで構成されます。 (これらのプロパティを公開することはできますが、最初にこの問題を修正したいと思います)。

public class UserLocation {

    private Float latitude;

    private Float longitude;

    private Date lastActive;
}

JSON本体

AngularJS Ajax呼び出し($http.PUT)を介して、次のデータを使用してSpringコントローラーに呼び出しを行います。

 {
    "latitude": 52.899370,
    "longitude": 5.804548,
    "lastActive": 1449052628407
 }

PostManリクエスト

私はCordovaアプリケーションを開発しているので、携帯電話にアプリケーションを構築せずにリクエストをテストするために、Chrome PostManプラグインを使用しています。

私は次の電話をかけています:

URL:http://server:port/app/location/update/1

Method:PUT

Headers:Content-Type: application/json

Body:

{
    "latitude": 52.899370,
    "longitude": 5.804548,
    "timestamp": 1449052628407
}

リクエスト結果

リクエストにより、次の結果が得られます。

{"latitude":null,"longitude":null,"lastActive":null}

これは、Springが私のUserLocationクラスの新しいインスタンスを作成するが、本体からのデータでそれを埋めないことを意味します。


Spring PUTメソッド

SpringコントローラーでPUTメソッドを使用する場合、エンティティはすぐに更新されませんか?つまり、エンティティを正しく更新するための追加のロジックがコントローラにないことを意味しますか? (エンティティがもちろんHibernate/JPAモデルであり、更新可能である場合)。


問題がわからないようです。誰かが私が間違っていることを知っていますか?


更新

コントローラコードに@RequestBodyを追加します:

@RequestMapping(value = "/location/update/{id}", method = RequestMethod.PUT)
public UserLocation updateUserLocation(@PathVariable("id") int id, @RequestBody UserLocation user) {        
            return user;        
}

元の質問に戻ります( 415メディアはサポートされていません )。これを追加すると、415 Media notsupportedエラーがスローされます。修正できないようです。


修正済み。以下の解決策

7
Mr.wiseguy

コントローラーにUserLocationオブジェクトの@RequestBodyが表示されませんか?また、プロパティにゲッターとセッターがあることを確認してください。

public UserLocation updateUserLocation(@PathVariable("id") int id, UserLocation user) {        

HTTP PUTを実行するときは、オブジェクトをデータベースに永続化するために追加のロジックを配置する必要があります。オブジェクトを永続化するには、DAOまたはリポジトリを呼び出す必要があります。通常、着信UserLocationオブジェクトを永続化する実際のJPA/Hibernateエンティティにマップします。これは自動的には発生しません。

6
Driss Amri

問題は、UserLocationパラメーターに@RequestBodyで注釈を付けるのを見逃したことです。

..updateUserLocation(@PathVariable("id") int id, @RequestBody UserLocation user)

また、gettersメンバー変数に対してsettersUserLocationを生成するようにしてください。

5
Tom Sebastian