Spring Boot 2 Maven目录视图解析器

时间:2019-06-21 15:23:53

标签: java spring maven spring-boot thymeleaf

我目前有一个使用Boot前端的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;
   // }


}

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:0)

您不需要 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";
   }

答案 1 :(得分:0)

您不需要MvcConfig类,Spring Boot会自动配置视图解析器。您所要做的就是将模板放入src/main/resources/templates/目录中,并进行如下简单的控制器映射

@RequestMapping(value = "/")
public String index() {
    return "index";
}

在家庭控制器中。 您也可以查看此React.js and Spring example

答案 2 :(得分:0)

您将需要通过以下方式配置资源处理程序:

@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上对其进行了测试,并且可以正常运行。