Spring Boot 2 Maven Directory View Resolver - PullRequest
2 голосов
/ 21 июня 2019

В настоящее время у меня есть приложение Spring Boot, которое использует React JS для внешнего интерфейса.Я работаю в Visual Studio и через веб-пакет собираю ресурсы и выводю их в целевую папку 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 голосов

Вам не нужен класс MvcConfig, Spring boot автоматически настраивает преобразователь представления.Все, что вам нужно сделать, это поместить ваши шаблоны в каталог src/main/resources/templates/ и сделать простое сопоставление контроллера, например,

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

в вашем домашнем контроллере.Вы также можете проверить этот пример React.js и Spring

0 голосов
/ 28 июня 2019

вам нужно будет настроить обработчик ресурсов следующим образом:

@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, и он работал префектом.

0 голосов
/ 21 июня 2019

вам не нужно MvcConfig

просто установите static-location свойство в src / main / resources / application.properties в 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";
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...