6

Я разрабатываю пружинный бэкэнд для одностраничного приложения на основе реакции, где я использую реактивный маршрутизатор для маршрутизации на стороне клиента.Весна поймать весь маршрут для index.html

Помимо страницы index.html, бэкэнд обслуживает данные по пути /api/**. не

Для того, чтобы служить моей index.html из src/main/resources/public/index.html на корневом пути / моего приложения я добавил обработчик ресурсов

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/").addResourceLocations("/index.html"); 
} 

То, что я хочу, чтобы служить страницу index.html, когда ни один другой маршрут совпадений, например когда я вызываю путь, отличный от /api.

Как настроить такой общий маршрут по весне?

ответ

5

Избегайте @EnableWebMvc

По умолчанию Spring-Boot служит статический контент в src/main/resources:

  • /META-INF/ресурсы/
  • /ресурсы/
  • /статический/
  • /public/

Взгляните на this и this;

Или держать @EnableWebMvc и переопределить addViewControllers

ли вы указали @EnableWebMvc?Посмотрите это: Java Spring Boot: How to map my app root (“/”) to index.html?

Либо вы удалите @EnableWebMvc, или вы можете повторно определить addViewControllers:

@Override 
public void addViewControllers(ViewControllerRegistry registry) { 
    registry.addViewController("/").setViewName("forward:/index.html"); 
} 

Или определить контроллер поймать /

Вы можете посмотреть a spring-boot-reactjs sample project on github:

Он делает то, что вы хотите, используя контроллер:

@Controller 
public class HomeController { 

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

} 

Его index.html находится под src/main/resources/templates

+1

Я думаю, что это должно быть отмечено как ответ на ваш вопрос. – pesoklp13

1

Обнаружили ответ, глядя на this question

@Bean 
public EmbeddedServletContainerCustomizer notFoundCustomizer() { 
    return new EmbeddedServletContainerCustomizer() { 
     @Override 
     public void customize(ConfigurableEmbeddedServletContainer container) { 
      container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/")); 
     } 
    }; 
} 
0

Я использую реагировать и реагировать-маршрутизатор в моей весной загрузки приложения, и это было так же просто, как создание контроллер, который имеет сопоставление с / и поддеревьями моего веб-сайта, например /users/** Вот мое решение

@Controller 
public class SinglePageAppController { 
    @RequestMapping(value = {"/", "https://stackoverflow.com/users/**", "/campaigns/**"}) 
    public String index() { 
     return "index"; 
    } 
} 

Апи звонки не пойманы этим контроллером, и ресурсы обрабатываются автоматически.

8

Поскольку мой реагировать приложение может использовать корень, как вперед цель это в конечном итоге работает для меня

@Configuration 
public class WebConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/{spring:\\w+}") 
      .setViewName("forward:/"); 
     registry.addViewController("/**/{spring:\\w+}") 
      .setViewName("forward:/"); 
     registry.addViewController("/{spring:\\w+}/**{spring:?!(\\.js|\\.css)$}") 
      .setViewName("forward:/"); 
    } 
} 

Честно говоря, я понятия не имею, почему он должен быть именно в этом конкретном формате, чтобы избежать бесконечного цикла переадресации ,

+0

Спасибо! Это отлично работает с настройками типа Angular 4 RouterModule + Spring Boot Embedded Container;) –

+0

Работайте со мной тоже. У меня есть статический угловой контент 4 в ресурсах, и я могу достичь каждого маршрута из моего приложения для пользовательского интерфейса! –

Смежные вопросы