[英]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"
}
調用庫,並得到foobarList是定義為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.web
和app.api
,那么使用單獨的 REST 控制器可能是您代碼的干凈設計實現。
深思熟慮
為網頁和 android 使用完整的 REST API 實現。 然后使用AngualarJS
或backboneJs
用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.