2 votes

Comment limiter les extensions de route dans les chemins @RequestMapping pour les contrôleurs Spring MVC ?

J'ai une tâche assez simple que je veux accomplir, mais je n'arrive pas à trouver d'informations sur le routage de Spring MVC à ce sujet. J'ai un contrôleur très simple qui route un chemin vers une vue :

@Controller
@RequestMapping(value = "/help")
public class HelpController {

    private static final String HELP = "help";

    @RequestMapping(method = RequestMethod.GET)
    public String help(Model model, Locale locale) {
        model.addAttribute("locale", locale);
        return HELP;
    }
}

Je voudrais lancer un 404 si http://mysite.com/help.some.extension.is.entered mais Spring semble résoudre l'exemple vers /help. La javadoc indique que l'annotation @RequestMapping est simplement un mappage d'URI de servlet, mais je pensais que /help signifiait qu'il devait s'agir d'une correspondance exacte. Toute clarification serait appréciée.

1voto

Nitek Points 1517

Pour Spring 4, c'est assez facile à résoudre :

<mvc:annotation-driven>
    <mvc:path-matching suffix-pattern="false" />
</mvc:annotation-driven>

Vous pouvez donc toujours utiliser mvc:annotation-driven pour votre configuration.

0voto

Ramesh Kotha Points 3805

Vous pouvez le mentionner dans l'annotation @RequestMapping

il est identique au modèle d'URL de Servlet uniquement.

@Controller
public class HelpController {

    private static final String HELP = "help";

    @RequestMapping(value = "/help" method = RequestMethod.GET)
    public String help(Model model, Locale locale) {
        model.addAttribute("locale", locale);
        return HELP;
    }

    @RequestMapping(value = "help/*" method = RequestMethod.GET)
    public String helpWithExtraWords() {
        return "error";
    }
}

0voto

Biju Kunjummen Points 20258

Le meilleur moyen auquel je pense est de configurer votre RequestMappingHandlerMapping explicitement pour ne pas considérer les suffixpaths, de cette façon :

<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="useSuffixPatternMatch" value="false"></property>
</bean>

Cependant, si vous avez configuré votre Spring MVC à l'aide de mvc:annotation-driven cela ne fonctionnera pas, vous devrez développer toute la définition du handlerAdapter, ce qui n'est pas si difficile à faire, en suivant ces lignes (ce n'est pas complet, vous pouvez regarder à travers org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser pour la définition complète) :

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="conversionService" ref="conversionService"></property>
            <property name="validator">
                <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
            </property>
        </bean>
    </property>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
        </list>
    </property>
</bean>

<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="useSuffixPatternMatch" value="false"></property>
</bean>

0voto

saurzcode Points 763

Avec Spring 3.0.X, vous pouvez utiliser la fonction useDefaultSuffixPattern propriété.

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false" />
</bean>

Vous devrez retirer </mvc:annotation-driven>

Consultez le site Restriction du modèle d'URL dans SPRING MVC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X