Je sers un SPA créé avec create-react-app et react-router à l'aide de Spring Boot 2.1.0 avec cette configuration

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/**/{path:[^\\.]+}")
                .setViewName("forward:/");
    }
}

Fondamentalement, il sert toujours index.html à moins qu'il n'y ait un point dans le chemin. Je voudrais aligner cela avec les applications de create-react-app fournies .htaccess. Comment puis-je faire en sorte que Spring Boot corresponde à cette fonctionnalité?

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
7
Roberto Graham 20 nov. 2018 à 15:34

3 réponses

Meilleure réponse

Pour rediriger "404: fichier non trouvé" vers "forward: /", ce que je pense être ce que fait le .htaccess, changez votre WebMvcConfiguration en ...

@Configuration
public class WebMvcConfiguration implements ErrorViewResolver
{

    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        if (status == HttpStatus.NOT_FOUND) {
            return new ModelAndView("forward:/");
        }
        return null;
    }

}
3
pcoates 29 nov. 2018 à 17:14

Vous pouvez attraper tout le contrôleur de vue non géré comme ci-dessous lorsqu'aucune autre route n'a été trouvée.

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
       registry.setOrder(Ordered.LOWEST_PRECEDENCE);
        registry.addViewController("/**").setViewName("forward:/index.html");
    }
}
2
Sukhpal Singh 23 nov. 2018 à 15:58

Suivre le code Kotlin peut aider:

@Configuration
class WebMvcConfig(val resourceProperties: ResourceProperties) : WebMvcConfigurer {

    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        registry.addResourceHandler("/**")
            .addResourceLocations(*resourceProperties.staticLocations)
            .resourceChain(resourceProperties.chain.isCache)
            .addResolver(FallbackPathResourceResolver())
    }

    private class FallbackPathResourceResolver : PathResourceResolver() {
        override fun resolveResource(
            request: HttpServletRequest?,
            requestPath: String,
            locations: MutableList<out Resource>,
            chain: ResourceResolverChain
        ): Resource? {
            return super.resolveResource(request, requestPath, locations, chain) ?: super.resolveResource(
                request,
                "/index.html",
                locations,
                chain
            )
        }
    }
}

Référence: https://jira.spring.io/browse/SPR-16788

0
Sola 27 nov. 2018 à 08:20