Spring MVC нечувствительные к регистру URL - PullRequest
3 голосов
/ 13 сентября 2011

Я искал ответ на этот вопрос в Google и stackoverflow, но, к сожалению, предоставленные решения либо предполагают много предварительных знаний о Spring MVC и Java, либо не учитывают регистр с аннотациями.

Из-за этого я не уверен, как адаптировать эти решения к моей собственной проблеме, поэтому причина этого нового вопроса об этом.

То, что я хочу сделать, звучит просто. У меня есть dispatcher-servlet.xml файл со следующим блоком XML:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="*.htm">pageController</prop>
                <prop key="*.html">pageController</prop>
                <prop key="/cms/*">pageController</prop>
                <prop key="/admin/*">adminController</prop>
            </props>
        </property>
    </bean>

Я хочу, чтобы ключи /cms/* и /admin/* не учитывали регистр, но, будучи новичком в Java и Spring MVC, я не понимаю, как мне поступить так.

Например, даже если кто-то наберет /CMS/ или /Cms/, я хочу, чтобы он использовал pageController, тогда как в данный момент он просто отобразит страницу 404.

Может ли кто-нибудь объяснить мне, что именно мне нужно сделать, чтобы достичь желаемого результата?

Любая помощь будет принята с благодарностью!

Edit:

Согласно ответу Рупока я добавил класс для расширения AntPathMatcher.

К сожалению, будучи новичком в этом, я не знаю, как «установить это обратно на SimpleUrlHandlerMapping».

Кто-нибудь сможет указать мне правильное направление?

Ответы [ 2 ]

5 голосов
/ 13 сентября 2011

Механизм сопоставления по умолчанию для SimpleUrlHandlerMapping - это AntPathMatcher.Вы можете либо создать собственную реализацию PathMatcher, либо создать подкласс AntPathMatcher и установить его обратно в SimpleUrlHandlerMapping.

Интерфейс PathMatcher довольно прост в реализации.

public class CaseInsensitiveAntPathMatcher extends AntPathMatcher {

@Override
public boolean match(String pattern, String string) {
    return super.match(pattern.toLowerCase(), string.toLowerCase()); // make this according to your need
}

}

0 голосов
/ 01 мая 2013

Ответ Рупока заставил меня начать в правильном направлении, но мне нужно было немного изменить реализацию, чтобы заставить ее работать.

public class CaseInsensitiveAntPathMatcher extends AntPathMatcher {
    @Override
    protected boolean doMatch(String pattern, String path, boolean fullMatch, Map<String, String> uriTemplateVariables) {
        return super.doMatch(pattern.toLowerCase(), path.toLowerCase(), fullMatch, uriTemplateVariables);
    }
}

match (String, String) и разорвать делегирование другого метода на doMatch (String, String, boolean, Map).

Кроме того, поскольку я использую org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping Мне нужно было подключить мой новый механизм сопоставления, например:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
    <property name="pathMatcher">
        <bean class="youpackage.CaseInsensitiveAntPathMatcher" />
    </property>
</bean>
...