在Spring Boot中从@RestController有条件地返回JSON和(HTML)模板

在Spring Boot中从@RestController有条件地返回JSON和(HTML)模板,spring,spring-mvc,spring-boot,spring-rest,Spring,Spring Mvc,Spring Boot,Spring Rest,大多数类似的问题似乎与我的问题相反 我正在使用@RestController构建一个基于Spring Boot的webapp。JSON响应工作得很好,但现在我想支持通过模板返回HTML(特别是Thymeleaf)。所有示例都显示了如下构建方法: @RequestMapping(method = RequestMethod.GET) String index() { return "index"; } 只要它所在的类用@Controller注释,这就可以正常工作。如果我使用@RestCo

大多数类似的问题似乎与我的问题相反

我正在使用
@RestController
构建一个基于Spring Boot的webapp。JSON响应工作得很好,但现在我想支持通过模板返回HTML(特别是Thymeleaf)。所有示例都显示了如下构建方法:

@RequestMapping(method = RequestMethod.GET)
String index()
{
    return "index";
}
只要它所在的类用
@Controller
注释,这就可以正常工作。如果我使用
@RestController
进行注释,我将返回文本字符串“index”。这是有道理的,因为
@RestController
意味着
@ResponseBody

总的来说,我有几个问题

  • 在设计用于返回JSON的方法上使用
    @Controller
    和显式
    @ResponseBody
    注释是否正确

  • 我担心我的控制器类会变得相当大,因为大多数GET方法都有两个实现(一个用于返回HATEOAS JSON,一个用于返回模型中包含更多内容的HTML)。是否有推荐的做法来考虑这一点

谢谢你的建议。谢谢

在设计用于返回JSON的方法上使用@Controller和显式@ResponseBody注释是否正确

只要控制器很小,并且只包含很少的方法,就可以

我担心我的控制器类会变得相当大,因为大多数GET方法都有两个实现(一个用于返回HATEOAS JSON,一个用于返回模型中包含更多内容的HTML)。是否有推荐的做法来考虑这一点

如果它们增长并变得难以阅读,则会拆分为一个返回HTML页面的
@Controller
和返回JSON的
@RestController


总之,关注可读性。从技术上讲,这两种方法都是正确的。

您可以返回
视图
模型和视图,而不是
字符串

@RequestMapping(method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE)
ModelAndView index()
{
  return new ModelAndView("index");
}
它允许您从带有
@RestController
注释的控制器返回HTML

@RestController
公共类SampleController{
@GetMapping(value=“/data/{id}”,products=MediaType.APPLICATION\u JSON\u value)
公共CustomClass get(@PathVariable字符串id){
返回newservice.getById(id);
}
@GetMapping(value=“/data/{id}”,products=MediaType.TEXT\u HTML\u value)
公共字符串getHTML(@PathVariable字符串id){
返回“HTML”;
}

}

您仍然可以将所有代码放在一个类中(或任何有意义的类),并使用该类作为委托器实现两个控制器。所有方法将只包含delegate.callMethod()。或者,您可以定义一个抽象基类,而不是委托,您可以将其扩展两次。所有方法将只包含super.callParentMethod()。在这两种情况下,控制器都只能是具有映射定义的空壳。