web-dev-qa-db-ja.com

SpringBootを使用したJSONおよびHTMLのコントローラー

私は、とりわけ特定のオブジェクトでCRUD操作を実行する必要があるアプリケーションを作成しています。人間のユーザー向けのHTMLページと、他のアプリケーション向けのJSONの両方を提供できる必要があります。現在、私のURLは「読み取り」の場合は次のようになっています。

GET  /foo/{id}      -> Serves HTML
GET  /rest/foo/{id} -> Serves JSON
etc.

これは少し冗長に思えます。私はむしろこのようなものが欲しいです:

GET /foo/{id}.html OR /foo/{id} -> Serves HTML
GET /foo/{id}.json              -> Serves JSON

Spring Bootはこれを行うことができますか?もしそうなら、どのように?

JSONを返す方法を知っています:

@RequestMapping(value = "/foo/{id}", method = RequestMethod.GET, produces = "application/json")
public Object fetch(@PathVariable Long id) {
    return ...;
}

HTMLを返す方法も知っています:

@RequestMapping("/app/{page}.html")
String index(@PathVariable String page) {
    if(page == null || page.equals(""))
        page = "index";
    return page;
}

しかし、リクエストに基づいてコントローラーにどちらかを実行させる方法がわかりません。

5
John

これはSpringBootのデフォルトの動作です。唯一のことは、JSONを生成するために@RequestMappingの1つをマークする必要があるということです。例:

@Controller
class HelloController {

    // call http://<Host>/hello.json
    @RequestMapping(value = "/hello", method = RequestMethod.GET, produces = "application/json")
    @ResponseBody
    public MyObject helloRest() {
        return new MyObject("hello world");
    }

    // call http://<Host>/hello.html or just http://<Host>/hello 
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String helloHtml(Model model) {
        model.addAttribute("myObject", new MyObject("helloWorld"));
        return "myView";
    }
}

続きを読む: http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc および http://spring.io/blog/2013/06/03/content-negotiation-using-views

19