【问题标题】:Spring Boot 2 Maven Directory View ResolverSpring Boot 2 Maven 目录视图解析器
【发布时间】: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;
   // }


}

【问题讨论】:

    标签: java spring maven spring-boot thymeleaf


    【解决方案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:/,而对于 windows file:///C:/path/to/dir/webapp/

      然后将/重定向到index.html

      @RequestMapping
      @RestController
      public class IndexEndpoint {
          @GetMapping("/")
          public String reactApp() {
              return "/index.html";
          }
      }
      

      我已经在MacOS 上对其进行了测试,效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-22
        • 2014-08-27
        • 2017-07-08
        • 1970-01-01
        • 2019-04-17
        • 2017-08-24
        • 1970-01-01
        • 2018-02-11
        相关资源
        最近更新 更多