2016-08-05 17 views
9

Bir Spring Boot (v1.3.6) tek sayfalık uygulama (angular2) var ve tüm isteği index.html'a iletmek istiyorum.Yay önyükleme tek sayfa uygulaması - her isteği index.html'ye iletme

http://localhost:8080/index.html için bir istek çalışıyor (200 ve ben index.html olsun) ama http://localhost:8080/home (404) değil.

Runner.class

@SpringBootApplication 
@ComponentScan({"packagea.packageb"}) 
@EnableAutoConfiguration 
public class Runner { 

    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext run = SpringApplication.run(Runner.class, args); 
    } 
} 

WebAppConfig.class

@Configuration 
@EnableScheduling 
@EnableAsync 
public class WebAppConfig extends WebMvcConfigurationSupport { 

    private static final int CACHE_PERIOD_ONE_YEAR = 31536000; 

    private static final int CACHE_PERIOD_NO_CACHE = 0; 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.setOrder(-1); 
     registry.addResourceHandler("/styles.css").addResourceLocations("/styles.css").setCachePeriod(CACHE_PERIOD_ONE_YEAR); 
     registry.addResourceHandler("/app/third-party/**").addResourceLocations("/node_modules/").setCachePeriod(CACHE_PERIOD_ONE_YEAR); 
     registry.addResourceHandler("/app/**").addResourceLocations("/app/").setCachePeriod(CACHE_PERIOD_NO_CACHE); 
     registry.addResourceHandler("/systemjs.config.js").addResourceLocations("/systemjs.config.js").setCachePeriod(CACHE_PERIOD_NO_CACHE); 
     registry.addResourceHandler("/**").addResourceLocations("/index.html").setCachePeriod(CACHE_PERIOD_NO_CACHE); 
    } 

} 

styles.css, /app/third-party/xyz/xyz.js, .. (200 ve ben doğru dosya olsun) çalışıyoruz. Sadece /** - index.html çalışmıyor.

+0

belki index.html korumalı bir klasörde veya içindedir diğer yol? – duardito

+0

@duardito 'index.html' aynı klasörde (' webapp') 'styles.css' olarak – Christoph

+0

"/home "ile eşleşen bir son nokta var mı? – duardito

cevap

0

Günlüklere bakmadan neden doğru şekilde haritalanmadığından emin değilim, ancak URL'leri bir görünüme (HTML) eşlemek istiyorsanız, muhtemelen viewController mekanizmasını kullanarak http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-view-controller yayını kullanmanız daha iyi olacaktır. Örneğin.

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
    registry.addViewController("/").setViewName("home"); 
    } 

} 

(yukarıda bağlantılı yaylı docs alınan -. Bir görünüm için bir url harita yerine statik kaynaklar için eşleme başka bir amaçla kullanmak nasıl budur) varsa

emin değilim Kaynak haritalama için her türlü sonek filtresi İlkbaharın ResourceHttpRequestHandler ile ilgili istekleri nasıl belirleyeceğini bilmiyorum - bir şey için http://localhost:8080/home.html gibi bir şey yapıp yapmadığınızı (sadece onaylamak veya reddetmek için) denediniz mi?

Ayrıca yukarıda tanımladığınız html haritalama sadece gözardı ediliyor olması mümkündür ve index.html sırf İlkbahar-Boot varsayılan giriş sayfası davranış çalışmaktadır: Ayrıca böyle bir yönlendirme denetleyicisi ekleyebilirsiniz https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java#L108

15

:

@Controller 
public class ForwardingController { 
    @RequestMapping("/{path:[^\\.]+}/**") 
    public String forward() { 
     return "forward:/"; 
    } 
} 

ilk bölümü {path:[^\\.]+} bir ya . dışındaki herhangi bir karakterin daha eşleşir. Bu, file.ext isteğinin bu RequestMapping tarafından ele alınmadığından emin olur. Yönlendirilecek alt yolları da desteklemeniz gerekiyorsa, {...}'un dışına /** yerleştirin.

+0

{varName: regex'in açıklaması için http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates-regex sayfasına bakın. Daha karmaşık regex tabanlı eşleştirmeye izin veren form. –

+0

"Yalnızca yapılandırma" çözümünü tercih etsem de, bu çözüm gerçekten çok iyi çalışıyor. Şerefe arkadaşlar! – Kai

+0

İsteklerimi "/ui/index.html" adresine ilettiğimden, yığın eşleme istisnasının önüne geçmek için yol eşlemesini "/**/{path:[^\\.]+}" olarak ayarladım. Son bileşende bir dönem karakterine sahip olan yolları eşleştirir. – Shannon

0

Aynı problem vardı ve aşağıdaki benim için çalıştı. Benim html dosyaları src/main/resources/static/app içinde var.

Anahtar, @EnableWebMvc'yi kaldırmak ve addResourceLocations'a "classpath:/static/app /" öğesini eklemekti! Bu yardımcı olur umarım.

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { 
     "classpath:/META-INF/resources/", "classpath:/resources/", 
     "classpath:/static/","classpath:/static/app/", "classpath:/public/" }; 

@Bean 
public WebMvcConfigurer webMvcConfigurer() { 
    return new WebMvcConfigurerAdapter() { 

     @Override 
     public void addResourceHandlers(ResourceHandlerRegistry registry) { 
      if (!registry.hasMappingForPattern("/webjars/**")) { 
       registry.addResourceHandler("/webjars/**").addResourceLocations(
         "classpath:/META-INF/resources/webjars/"); 
      } 
      if (!registry.hasMappingForPattern("/**")) { 
       registry.addResourceHandler("/**").addResourceLocations(
         CLASSPATH_RESOURCE_LOCATIONS); 
      } 
     } 


     @Override 
     public void addViewControllers(ViewControllerRegistry registry) { 
      // forward requests to /admin and /user to their index.html 
      registry.addViewController("/portal").setViewName(
        "forward:/app/index.html"); 
     } 
    }; 
} 
0

Bu bana işe yaramadı:

return "forward:/"; 

Teşekkür Ben güzel çalışma çözüm buldu Spring MVC @RestController and redirect için:

@RequestMapping(value = "/{[path:[^\\.]*}") 
public void redirect(HttpServletResponse response) throws IOException { 
    response.sendRedirect("/"); 
} 
İlgili konular