2

我有一个相当简单的任务要完成,但似乎找不到有关 Spring MVC 路由的信息。我有一个非常简单的控制器,可以将路径路由到视图:

@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;
    }
}

如果http://mysite.com/help.some.extension.is.entered ,我想抛出 404 ,但 Spring 似乎将示例解析为 /help。javadoc 说 @RequestMapping 注释只是一个 servlet URI 映射,但我认为 /help 意味着它需要完全匹配。任何澄清将不胜感激。

4

4 回答 4

1

对于 Spring 4,很容易解决:

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

所以你仍然可以使用mvc:annotation-driven你的配置。

于 2014-05-09T20:09:39.017 回答
0

您可以在 @RequestMapping 注释中提及它

它仅与 Servlet URL 模式相同。

@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";
    }
}
于 2012-06-04T20:12:30.427 回答
0

我能想到的最好方法是明确配置您的 RequestMappingHandlerMapping 以不考虑后缀路径,这样:

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

但是,如果您使用 配置了 Spring MVC mvc:annotation-driven,这将不起作用,您将不得不扩展整个 handlerAdapter 定义,这并不难做到,沿着这些线(这不完整,您可以org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser查看完整定义):

<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>
于 2012-06-04T20:33:05.170 回答
0

在 Spring 3.0.X 中,您可以使用useDefaultSuffixPattern属性。

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

您将需要删除</mvc:annotation-driven>

参考SPRING MVC 中的 URL 模式限制

于 2012-06-05T04:49:56.743 回答