サーバーでSpringMVCを使用すると、基本的なRESTAPIが得られます。
@Controller
@RequestMapping(value="/entities")
public class EntityController
{
//GET /entities
@RequestMapping(method=RequestMethod.GET)
@ResponseBody
public List<Entity> getEntities()
...
//GET /entities/{id}
@RequestMapping(value="/{id}", method=RequestMethod.GET)
@ResponseBody
public Entity getEntity(@PathVariable Long id)
...
//POST /entities
@RequestMapping(method=RequestMethod.POST, consumes="application/json")
@ResponseBody
public Entity createEntity(@RequestBody Entity entity)
...
//PUT /entities
@RequestMapping(method=RequestMethod.PUT, consumes="application/json")
@ResponseBody
public Entity updateEntity(@RequestBody Entity entity)
...
}
これはすべて問題なく機能します。今、私はEntity
1つのリクエストで複数のを作成または更新できるようにしたいと思っています。私の最初の考えはこれを追加することでした:
@RequestMapping(method=RequestMethod.PUT, consumes="application/json")
@ResponseBody
public List<Entity> updateEntities(@RequestBody List<T> entities)
URLは同じですが、updateEntity
リストを処理します([...]
)。はupdateEntity
単一のオブジェクト({...}
)を処理します。ただし、サーバーの起動時に次のエラーが発生しました。
java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'entityController' bean method public java.util.List<foo.bar.Entity> foo.bar.EntityController.updateEntities(java.util.List<foo.bar.Entity>) to {[/entities],methods=[PUT],params=[],headers=[],consumes=[application/json],produces=[],custom=[]}: There is already 'entityController' bean method public foo.bar.Entity foo.bar.EntityController.updateEntity(foo.bar.Entity) mapped.
ですから、私が収集したところによると、Springは、同じ方法が異なっ@RequestMapping
ていても、 2つの異なる方法を好まないの@RequestBody
です。
これは私に2つの質問につながります。まず、私はこれを正しいRESTfulな方法で行っていますか?同じURLに対してPUTを実行し、リクエストの本文を単一のオブジェクトまたはリストにすることを許可する場合、RESTfulの原則に準拠していますか?Springが望んでいるこれを行う別の正しい方法はありますか?(わかりました、最初の質問は実際には3つでした...)
2番目の質問は@RequestMapping
、2つのメソッドを十分に区別するが、同じRESTAPIを維持するアノテーションに追加できるものがあるかどうかです。
あなたがこれに当てることができるどんな光にも感謝します。