Spring MVC,Thymeleaf和REST

我目前有一个项目使用Spring控制器和Thymeleaf来创build一个小的浏览器应用程序。 控制器类声明为

@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调用存储库,用foobar列表填充模型 ,而Thymeleaf则使用该列表进行处理。

问题:现在我需要从Android应用程序访问相同的数据,我宁愿使用REST,只是在Android应用程序中使用JSON。 我想保持Thymeleaf,但必要时会重构浏览器应用程序。

问题:有没有办法以某种方式使用相同的@Controller,或者我将不得不使用@RestController与/ restFoobars端点维护第二个FoobarRestController? 第二个REST控制器工作肯定,但它似乎有点马虎…糟糕的devise。

你的想法和build议?

再次感谢。 -丰富

Related of "Spring MVC,Thymeleaf和REST"

暴露Crud

使用@Controller来完成处理HTML页面的工作,并使用Repository通过使用SPRING-DATA-REST来暴露实体,从而通过Rest API的基本操作暴露实体。 我认为你已经通过查看代码来完成了

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

公开业务逻辑

如果你想公开任何业务逻辑,你必须创build一个Service层,只需通过你的@Controller为网页调用。 并为Web API接口创build另一个控制器作为@RestController

您可能会注意到,这里没有复制任何代码,因为逻辑是写在Service层的单个点上的。 但是为不同的目的使用不同的控制器

由于您不需要Web页面中的所有逻辑都可以暴露给API,因此,如果您可以将代码作为app.webapp.api进行命名空间分离,那么为REST使用单独的控制器对于您的代码可能是干净的devise实现。

食物的思想

为网页和android使用完整的REST API实现。 然后使用AngualarJSbackboneJs来执行HTML5的客户端实现。 我认为这是未来。

我最喜欢的方法是使用inheritance:

 @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 } } 

或者,如果有大量的工作需要检查input等,你可以在BaseController实现这个function,然后得到一个abstract listAllResponse(DomainObject foo) ,然后返回适当的ModelAndView (HTML)或者DTO(JSON)。

这种方法的一个缺陷是你不能只覆盖@RequestMapping的一部分,所以当你指定了produces参数时,你必须重复类的部分映射,但是你可以inheritance方法级映射问题。