0

サーバーで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)
    ...
}

これはすべて問題なく機能します。今、私はEntity1つのリクエストで複数のを作成または更新できるようにしたいと思っています。私の最初の考えはこれを追加することでした:

@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を維持するアノテーションに追加できるものがあるかどうかです。

あなたがこれに当てることができるどんな光にも感謝します。

4

1 に答える 1

0

各モデルの @JsonIgnoreProperties(ignoreUnknown = true)

私はこの方法で... 2つのモデルを使用しました:ユーザーとツリー

@RequestMapping(value = "/users/testBean", method = RequestMethod.POST, consumes={"application/json","application/xml"}, produces={"application/json","application/xml"}) 
    public @ResponseBody List<User> testBean(@RequestBody Object object) {
        System.out.println("testBean called");
        System.out.println(object.toString());

        ObjectMapper mapper=new ObjectMapper();

        User user =mapper.convertValue(object, User.class);
        Tree tree =mapper.convertValue(object, Tree.class);

        System.out.println("User:"+user.toString());
        System.out.println("Tree:"+tree.toString());
        return userService.findAll();
    }
于 2013-06-13T05:05:02.647 に答える