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.
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 {...}
.
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
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("/");
}
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");
}
};
}