そのため、「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より前)のものであるため、現在はまったく異なるものがいくつかあります。
同様の投稿:
POSTで空の文字列を提供するSpringの@RequestBody
スプリングコントローラー
私の春には@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エラーがスローされます。修正できないようです。
修正済み。以下の解決策
コントローラーにUserLocationオブジェクトの@RequestBodyが表示されませんか?また、プロパティにゲッターとセッターがあることを確認してください。
public UserLocation updateUserLocation(@PathVariable("id") int id, UserLocation user) {
HTTP PUTを実行するときは、オブジェクトをデータベースに永続化するために追加のロジックを配置する必要があります。オブジェクトを永続化するには、DAOまたはリポジトリを呼び出す必要があります。通常、着信UserLocationオブジェクトを永続化する実際のJPA/Hibernateエンティティにマップします。これは自動的には発生しません。
問題は、UserLocationパラメーターに@RequestBody
で注釈を付けるのを見逃したことです。
..updateUserLocation(@PathVariable("id") int id, @RequestBody UserLocation user)
また、getters
メンバー変数に対してsetters
とUserLocation
を生成するようにしてください。