InternalResourceViewResolver无法正确解析视图

Bil*_*l L 6 spring spring-mvc spring-boot

我不知道我们在这里做错了什么。我正在尝试建立一个单页Spring MVC项目,以便我研究一下。我greeting.html正在尝试加载一个屏幕。这是我的控制器类来加载它:

@Controller
public class GreetingController {

    @GetMapping("/greeting")
    public String getGreeeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);

        return "greeting";
    }

}
Run Code Online (Sandbox Code Playgroud)

当这工作得很好greeting.html/resources/templates/greeeting.html。但是,我想要在WEB-INF文件夹后面。我试过将它放在WEB-INF/views/greeting.html和中webapp/WEB-INF/views/greeting.html。然后,我尝试使用InternalResourceViewResolver网上阅读的:

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".html");

    return viewResolver;
}
Run Code Online (Sandbox Code Playgroud)

以我的理解,这应该可以让它找到greeting.html我的WEB-INF文件夹设置之一。但是,当我转到时localhost:8080/greeting,在控制台中会收到404和以下消息:

WARN 1439 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler : Path with "WEB-INF" or "META-INF": [WEB-INF/views/greeting.html]

我完全不知道发生了什么或如何修复它,每个在线教程都可以做到这一点,也没有问题,我似乎找不到任何人遇到同样的问题。任何指导都将对您有所帮助。

小智 7

尝试从tomcat-embed-jasper dependency 中删除提供的或在范围标记中添加${tomcat-embed-jasper.scope}。这对我有帮助。


Myk*_*ura 2

您好,据我从您的问题中了解到您正在使用 spring boot 默认情况下 spring boot 搜索 src/main/resources/templates 文件夹 如果您使用了一些依赖项,例如:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-thymeleaf</artifactId> 
</dependency>
Run Code Online (Sandbox Code Playgroud)

这将默认启用百里香。

要覆盖你的 ViewResolver 你需要

在 Spring Boot 中,您可以在 application.properties 文件中进行此类配置:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.html
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 java config 编写自定义解析器配置:

@Configuration
@EnableWebMvc
@ComponentScan
public class MvcConfiguration extends WebMvcConfigurerAdapter
{
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html");
        registry.viewResolver(resolver);
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }  
 }
Run Code Online (Sandbox Code Playgroud)

我认为这很有帮助