Как ограничить расширения маршрутов в путях @RequestMapping для контроллеров Spring MVC?

У меня довольно простая задача, которую я хочу выполнить, но, похоже, не могу найти информацию о маршрутизации 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;
    }
}

Я хотел бы бросить 404, еслиhttp://mysite.com/help.some.extension.is.entered, но Spring, кажется, разрешает пример в / help. Javadoc говорит, что аннотация @RequestMapping - это просто отображение URI сервлета, но я подумал / help означает, что оно должно быть точным соответствием. Любое разъяснение будет оценено.

Ответы на вопрос(4)

это то же самое, что и шаблон 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";
    }
}
 Roosh05 июн. 2012 г., 00:05
Спасибо за ответ! Тем не менее, это не решает проблему, потому что маршрут имеет / * перед ним. Моя цель - вернуть 404 при вводе /help.suffix. Spring принимает символ точки в качестве допустимого расширения / help.

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

Таким образом, вы все еще можете использоватьmvc:annotation-driven для вашего конфига.

useDefaultSuffixPattern имущество.

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

Вам нужно будет удалить</mvc:annotation-driven>

обращатьсяОграничение шаблонов URL в SPRING MVC

 Roosh06 июн. 2012 г., 16:55
Я начал получать исключения сервлета, когда удалил & lt; mvc: annotation-driven & gt ;. javax.servlet.ServletException: нет адаптера для обработчика [[email protected]]: реализует ли ваш обработчик поддерживаемый интерфейс, такой как Controller?
 08 июн. 2012 г., 13:35
@Roosh Вы также должны использовать & lt; bean name = & quot; handlerAdapter & quot; класс = & Quot; org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAda & # x200C; & # x200B; PTER & Quot; & GT; & APOS; это будет работать !!

о котором я могу подумать, - это настроить свою 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>
 Roosh05 июн. 2012 г., 00:00
Я попробовал нечто очень похожее из поста на форуме источников. Похоже, что это не имеет значения.forum.springsource.org/…
 Roosh05 июн. 2012 г., 00:08
Я использую Spring 3.0.6. Я не удалил & lt; mvc: annotation-driven & gt; выписка из весеннего файла. Я попробую это и сообщу, работает ли это.
 05 июн. 2012 г., 00:17
Да, это должно быть причиной @Roosh, в Spring 3.0.6 первая строка должна быть<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
 05 июн. 2012 г., 00:05
Это странно @Roosh, эта конфигурация работает для меня, вы можете подтвердить, что вы полностью удалилиmvc:annotation-driven и есть только этот обработчик карты. Кроме того, можете ли вы сказать мне версию Spring, которую вы используете - Spring 3.0.5 конфигурация отличается от того, что я предоставил (это для Spring 3.1+)

Ваш ответ на вопрос