web-dev-qa-db-fra.com

Application à une page pour le démarrage du printemps - transfère chaque demande à index.html

J'ai une application d'une seule page (angular2) dans Spring Boot (v1.3.6) et je souhaite transférer toutes les demandes au index.html.

Une demande à http: // localhost: 8080/index.html fonctionne (200 et je reçois l'index.html) mais http: // localhost: 8080/home n'est pas (404).

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, .. fonctionnent (200 et j'obtiens le bon fichier). Seul /** à index.html ne fonctionne pas.

15
Christoph

Vous pouvez également ajouter un contrôleur de transfert tel que:

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

La première partie {path:[^\\.]+} correspond à un ou plusieurs caractères autres que .. Cela garantit que la demande pour un file.ext ne soit pas traitée par ce RequestMapping. Si vous devez également prendre en charge les sous-chemins, placez /** en dehors du {...}.

31
Jean Marois

Sans consulter les journaux, je ne suis pas tout à fait sûr de savoir pourquoi son mappage n'est pas correct. Toutefois, si vous souhaitez mapper des URL sur une vue (HTML), vous ferez probablement mieux d'utiliser le mécanisme viewController. Spring fournit http: // docs .spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html # mvc-config-view-controller . par exemple.

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

}

(extrait de la documentation printanière liée ci-dessus - vous devez ainsi mapper une URL sur une vue plutôt que de réaffecter la mappage à des ressources statiques.)

Je ne sais pas s'il existe un quelconque filtrage par suffixe pour le mappage des ressources - par exemple. Je ne sais pas comment spring décide de mapper les demandes sur la ResourceHttpRequestHandler - avez-vous essayé (pour confirmer ou infirmer) si quelque chose comme http: // localhost: 8080/home.html amps à quoi que ce soit?

Il est également possible que le mappage HTML que vous avez défini ci-dessus soit simplement ignoré et que le fichier index.html fonctionne simplement en raison du comportement par défaut de la page d'accueil de Spring-Boot: https://github.com/spring-projects/spring-boot /blob/master/spring-boot-autoconfigure/src/main/Java/org/springframework/boot/autoconfigure/web/ResourceProperties.Java#L108

2
rhinds

Celui-ci n'a pas fonctionné pour moi:

return "forward:/";

Merci à Spring MVC @RestController et à la redirection j'ai trouvé une solution qui fonctionne bien:

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

J'ai eu le même problème et les suivants ont fonctionné pour moi. Mes fichiers html sont dans src/main/resources/static/app

La clé consistait à supprimer @EnableWebMvc et à ajouter "classpath:/static/app /" à addResourceLocations! J'espère que cela t'aides. 

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
Ronny Shibley