Spring Boot 2 Maven 目录视图解析器
Posted
技术标签:
【中文标题】Spring Boot 2 Maven 目录视图解析器【英文标题】:Spring Boot 2 Maven Directory View Resolver 【发布时间】:2019-11-04 11:21:37 【问题描述】:我目前有一个使用 React JS 作为前端的 Spring Boot 应用程序。我在 Visual Studio 中运行,通过 webpack,我正在编译资源并将它们输出到 Maven 目标文件夹。您可以看到目录结构,Java 类位于“classes”文件夹中,客户端应用程序现在位于 webapp 文件夹中——注意 index.html。
因为这是一个单页应用程序,我只需要这个页面来解析。因此,我的控制器配置为返回索引文件。
@SpringBootApplication
public class AdminApplication
public static void main( String[] args )
SpringApplication.run( AdminApplication.class, args );
@Controller
public class DefaultController
@RequestMapping( "/**" )
public ModelAndView reactApp()
return new ModelAndView( "index" );
现在。我的问题是告诉我的视图解析器与这个目录对话。
正如您从注释代码中看到的那样,我只尝试了几百个选项来尝试让它解析视图。我已经在 documentRoot 上获得了我的项目目录的完整文件路径,因此如果有必要并且认为可能我会需要它。
我在控制器中放置了一个断点,这肯定会被命中,每次尝试查找相关视图时它只会返回 404。关于我的 viewResolver 可能需要看起来像什么的任何指导表示赞赏。我可以看到有几个类可能正确也可能不正确:
例如SpringResourceTemplateResolver 和 ClassLoaderTemplateResolver - 不确定其中哪一个最符合我的要求
@EnableWebMvc
@Configuration
public class MvcConfig implements WebMvcConfigurer,ApplicationContextAware
private ApplicationContext context;
@Value("$server.document-root:")
private String documentRoot;
@Override
public void setApplicationContext( ApplicationContext applicationContext )
this.context = applicationContext;
// private ITemplateResolver htmlTemplateResolver()
// SpringResourceTemplateResolver resolver = new
// SpringResourceTemplateResolver();
// resolver.setApplicationContext(applicationContext);
// resolver.setPrefix(documentRoot);
// resolver.setCacheable(false);
// resolver.setTemplateMode(TemplateMode.HTML);
// return resolver;
//
// @Bean
// public SpringResourceTemplateResolver templateResolver()
// SpringResourceTemplateResolver templateResolver = new
// SpringResourceTemplateResolver();
// templateResolver.setPrefix( "/webapp/" );
// templateResolver.setCacheable(false);
// templateResolver.setSuffix(".html");
// templateResolver.setTemplateMode("HTML");
// return templateResolver;
//
private ITemplateResolver templateResolver()
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(context);
resolver.setPrefix("templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
return resolver;
// public ITemplateResolver templateResolver()
// ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
// templateResolver.setPrefix("templates/");
// templateResolver.setCacheable(false);
// templateResolver.setSuffix(".html");
// templateResolver.setTemplateMode(TemplateMode.HTML);
// templateResolver.setCharacterEncoding("UTF-8");
// return templateResolver;
//
【问题讨论】:
【参考方案1】:你不需要 MvcConfig
只需将 src/main/resources/application.properties 中的 static-locations 属性设置为 spring.resources.static-locations=classpath:/webapp/
将所有可能的请求映射到您的索引页面,例如:
@GetMapping("/index","/","/home")
public String reactApp()
return "/index.html";
可选,您可以将请求重定向到您的索引页面
@GetMapping("/index","/","/home")
public String reactApp()
return "redirect:/index.html";
【讨论】:
不幸的是,这不起作用。解析模板“/index.html”时出错,模板可能不存在或可能无法被任何配置的模板解析器访问 org.thymeleaf.exceptions.TemplateInputException:解析模板“/index.html”时出错,模板可能不存在或可能任何配置的模板解析器都无法访问 @Squiggs。 “我只需要这个页面来解决”所以你不需要百里香。【参考方案2】:你不需要 MvcConfig 类,Spring boot 自动配置视图解析器。您所要做的就是将您的模板放到src/main/resources/templates/
目录中,然后像这样进行简单的控制器映射
@RequestMapping(value = "/")
public String index()
return "index";
在您的家庭控制器中。 你也可以看看这个React.js and Spring example
【讨论】:
【参考方案3】:你需要配置你的资源处理程序,这样:
@Configuration
public class StaticResourceConfiguration implements WebMvcConfigurer
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
registry.addResourceHandler("/**")
.addResourceLocations("file:/path/to/dir/webapp/");
注意,在 unix 中,您将使用
file:/
,而对于 windowsfile:///C:/path/to/dir/webapp/
然后将/
重定向到index.html
@RequestMapping
@RestController
public class IndexEndpoint
@GetMapping("/")
public String reactApp()
return "/index.html";
我已经在MacOS
上对其进行了测试,效果很好。
【讨论】:
以上是关于Spring Boot 2 Maven 目录视图解析器的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot Maven 插件 - 没有 BOOT-INF 目录