簡體   English   中英

Spring MVC、Thymeleaf 和 REST

[英]Spring MVC, Thymeleaf & REST

我目前有一個使用 Spring 控制器和 Thymeleaf 的項目來創建一個小瀏覽器應用程序。 控制器類聲明為

@Controller public class MyController {

在控制器內部,我有一個GET定義為

@RequestMapping(value = "/foobars", method = RequestMethod.GET)
String index(Model model, --- more params ---) {
    //call repository and get foobarsList
    //model.addAttribute("foobars", foobarsList);
          ...
    return "foobars/foobarThymeleafTemplate"
}

調用庫,並得到foob​​arList是定義為MongoRepository呼叫:

public interface FoobarRepository extends MongoRepository< ... cut for brevity> {

    @RestResource(rel = "by-id") 
    Marker findMarkerById(String id);

    ... additional @RestResources cut for brevity ...
}

同樣,瀏覽器應用程序看起來很棒。 GET調用存儲庫,使用 foobars 列表填充模型,Thymeleaf 使用該列表執行此操作。

問題:現在我需要從Android應用程序訪問相同的數據,我更喜歡使用 REST 並且只在 Android 應用程序中使用 JSON。 我想保留 Thymeleaf,但會在必要時重構瀏覽器應用程序。

問題:有沒有辦法以某種方式使用相同的 @Controller 或者我是否必須使用帶有 /restFoobars 端點的 @RestController 來維護第二個 FoobarRestController? 第二個 REST 控制器肯定可以工作,但它似乎有點草率……糟糕的設計。

您的想法和建議?

再次感謝。 -富有的

我的首選方法是使用繼承:

@RequestMapping('/foobars')
abstract class FoobarBaseController {

    @RequestMapping
    abstract listAll()
}

@Controller
class FoobarHtmlController extends FoobarBaseController {
    @Override ModelAndView listAll() {
        new ModelAndView('foobars/foobarThymeleafTemplate', [foobars: foobarsList])
    }
}

@RestController
@RequestMapping('/foobars', produces = MediaType.APPLICATION_JSON_VALUE)
class FoobarJsonController extends FoobarBaseController {
    @Override Collection<Foobar> listAll() {
        foobarsList
    }
}

或者,如果有大量工作要做檢查輸入等,您可以在BaseController實現它,並有一個abstract listAllResponse(DomainObject foo)然后返回適當的ModelAndView (HTML) 或 DTO (JSON)。

這種方法的一個缺陷是你不能只覆蓋@RequestMapping的一部分,所以當你指定produces參數時你必須重復類的映射部分,但是你可以繼承方法級映射而沒有問題。

暴露原油

使用@Controller來完成處理 HTML 頁面的工作,並使用 Repository 您可以通過使用SPRING-DATA-REST公開您的實體,通過 rest API 公開實體以進行基本操作,例如 crud。 我想你已經通過查看代碼做到了

 @RestResource(rel = "by-id") 
    Marker findMarkerById(String id);

暴露業務邏輯

如果您想公開任何業務邏輯,您必須創建一個Service層,並通過您的@Controller為網頁簡單地調用它。 並為 Web API 接口創建另一個控制器作為@RestController

您可能會注意到,這里沒有復制任何代碼,因為邏輯是在服務層的單個點編寫的。 但是為了不同的目的使用不同的控制器。

由於您不需要將網頁中的所有邏輯都暴露給 API,如果您可以將代碼命名為app.webapp.api ,那么使用單獨的 REST 控制器可能是您代碼的干凈設計實現。

深思熟慮

為網頁和 android 使用完整的 REST API 實現。 然后使用AngualarJSbackboneJs用HTML5 做客戶端實現。 我認為這就是未來。

您似乎可以將 @RestController 用於 Thymeleaf HTML 和 REST/JSON。

以下對我有用:

@RestController
@RequestMapping("/projects")
public class ProjectController {

        /**
         * A REST reponse (JSON)
         * 
         * @param name
         * @return
         */
        @GetMapping(value = "/{name}")
        public Project get(@PathVariable String name) {
            return new Project(1l, name); 
        }

        /**
         * A thymeleaf HTML response
         */
        @GetMapping(value = "/hello.html")
        public String getAsHtml() {
            return "hello"; //name of the html file in src/main/resources/templates
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM