显示文本“索引”而不是我的 index.html 文件的内容

Posted

技术标签:

【中文标题】显示文本“索引”而不是我的 index.html 文件的内容【英文标题】:The text "index" is getting displayed instead of the contents of my index.html file 【发布时间】:2022-01-14 22:10:28 【问题描述】:

我的 RestController 中有这个方法:

@GetMapping("/")
public Mono<String> index(Model model) 
    model.addAttribute("images", imageService.findAllImages());
    return Mono.just("index");

当我运行我的应用程序时,我得到一个页面,除了左上角的文本 index 之外什么都没有。如果我将return Mono.just("index"); 更新为return Mono.just("foo");,那么foo 会显示在左上角。

我预计文件resources/templates/index.html 会显示在浏览器中。我该如何解决这个问题?

【问题讨论】:

是用Controller还是RestController注解?请使用Controller 注释尝试一次。 【参考方案1】:

就像 Paras 提到的,主要问题可能是控制器类顶部的注释不正确。

@RestController@Controller 在模板处理方面表现不同。

@RestController 基本上只返回您的对象(在本例中是由Mono.just(...) 生成的对象),该对象通常被转换为 JSON 或纯文本(取决于设置)。

@Controller 注解通常意味着控制器方法的返回应该被视为从模板根到HTML 模板的路径。在这种情况下,您实际上并不需要 Mono.just() 构造(iirc 为响应式开发创建通量) - 只需像这样返回 String

@Controller
public class MyController 
    private ImageService imageService;

    @RequestMapping( "/" ) // could also be @GetMapping( "/" )
    public String index( Model model ) 
        model.addAttribute("images", imageService.findAllImages());
        return "index";
    

    @Autowired
    public void setImageService( ImageService imageService ) 
        this.imageService = imageService;
    

另外,我真的不明白您究竟为什么尝试使用 Rest Controller 来显示页面。如果您想异步加载页面内容,您可以定义一个简单的控制器并将指定的 URL 调用为 ajax get。但请注意,在这种方法中,您将再次在页面内获得一个完整的页面(带有&lt;html&gt;&lt;head&gt; 等)。为防止将您的内容包装在您的 index.html 中,如下所示:

<!-- head, meta etc -->
<body>
    <th:block th:fragment="content">
        <!-- page content goes here -->
    </th:block>
</body>

并在控制器中的 index( Model model ) 方法中将返回字符串更改为 "index :: content"

如果这没有帮助,请提供您的百里香豆定义。

【讨论】:

以上是关于显示文本“索引”而不是我的 index.html 文件的内容的主要内容,如果未能解决你的问题,请参考以下文章

Node/Express:数据库打印在屏幕上而不是 index.html

网站显示目录而不是索引

在 QStyledItemDelegate 中显示 QComboBox 文本而不是索引值

何时使用 index.php 而不是 index.html

Keycloak 将我重定向到我的索引 url 而不是请求的

创建或保存数据后重定向到索引而不是显示