弹簧休息控制器不返回html

Posted

技术标签:

【中文标题】弹簧休息控制器不返回html【英文标题】:Spring rest controller not returning html 【发布时间】:2017-09-01 23:38:30 【问题描述】:

我使用的是 spring boot 1.5.2,我的 spring rest 控制器看起来像这样

@RestController
@RequestMapping("/")
public class HomeController 

    @RequestMapping(method=RequestMethod.GET)
    public String index() 
        return "index";
    


当我转到http://localhost:8090/assessment/ 时,它会到达我的控制器,但不会返回我的 index.html,它位于 src/main/resources 或 src/main/resources/static 下的 maven 项目中。如果我访问这个 url http://localhost:8090/assessment/index.html,它会返回我的 index.html。我查看了本教程https://spring.io/guides/gs/serving-web-content/,他们使用百里香叶。我必须使用 thymeleaf 或类似的东西让我的弹簧休息控制器返回我的视图吗?

我的应用程序类看起来像这样

@SpringBootApplication
@ComponentScan(basePackages="com.pkg.*")
public class Application 

    public static void main(String[] args) throws Exception 
        SpringApplication.run(Application.class, args);
    

当我将 thymeleaf 依赖项添加到我的类路径时,我收到此错误(500 响应代码)

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "index", template might not exist or might not be accessible by any of the configured Template Resolvers

我想我确实需要百里香叶?我现在将尝试正确配置它。

更改我的控制器方法以返回 index.html 后它可以工作

@RequestMapping(method=RequestMethod.GET)
public String index() 
    return "index.html";

我认为 thymeleaf 或类似的软件可以让您省略文件扩展名,但不确定。

【问题讨论】:

对于初学者,将其设为 Controller 而不是 RestController 现在它仍然到达控制器,但我得到一个 404,无论 index.html 是在 src/main/resources 还是 src/main/resources/static 中。 localhost:8090/assessment/index.html 仍然有效 【参考方案1】:

RestController 注释从方法返回 json,而不是 HTML 或 JSP。它是@Controller 和@ResponseBody 合二为一。 @RestController 的主要目的是创建 RESTful Web 服务。对于返回 html 或 jsp,只需使用 @Controller 注释控制器类即可。

【讨论】:

我已将其更改为@Controller,现在我得到一个 404 但请求映射仍在工作。我需要添加视图解析器 bean 吗? http://localhost:8090/assessment/index.html 仍然有效 不,这就是给我 404 的原因 给出 404。将百里香添加到我的类路径后得到 500 现在我得到一个 304,它到达了我的控制器【参考方案2】:

你的例子是这样的:

您的控制器方法与您的路线“评估”

@Controller
public class HomeController 

    @GetMapping("/assessment")
    public String index() 
        return "index";
    


“src/main/resources/templates/index.html”中的 Thymeleaf 模板

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p>Hello World!</p>
</body>
</html>

【讨论】:

【参考方案3】:

我通过从配置类中删除 @EnableWebMvc 注释解决了这个问题。

Spring MVC 自动配置提供静态index.html 支持。

如果你想完全控制 Spring MVC,你可以添加你的 自己的@Configuration@EnableWebMvc 注释。

从Spring MVC Auto-configuration获取更多详细信息。

【讨论】:

【参考方案4】:

如果您尝试“构建 RESTful Web 服务” -> 如果不使用 @Controller 类注释您的控制器类,则使用 @RestController 注释注释您的控制器类。

当我们使用spring作为SpringMVC - @Controller

当我们使用 spring 作为 SpringRESTfull Web Service - @RestController

使用此链接阅读:Spring Stereo Type

【讨论】:

以上是关于弹簧休息控制器不返回html的主要内容,如果未能解决你的问题,请参考以下文章

如何从弹簧控制器返回未找到状态

在身体异常弹簧休息中添加新字段

junit中的模拟休息服务(带弹簧)

服务器发送事件 Spring Webflux 返回事件名称以响应来自休息控制器的响应

如何使弹簧安全允许使用休息服务

Spring单元测试休息控制器错误