Spring 3 HandlerInterceptorAdapter. Запрос заканчивается 404 до вызова перехватчика - PullRequest
1 голос
/ 26 июля 2011

Я пишу пользовательский обработчик-перехватчик для того, чтобы иметь многоязычные адреса URL. Например, когда пользователь обращается к uri /de/auto, появляется немецкий контент, когда пользователь обращается к /en/car, тогда появляется английский контент. Я хочу, чтобы оба запроса перенаправлялись на один и тот же контроллер и один и тот же метод:

@Controller
public class MultiLangController {

    @RequestMapping(value="/en/car", method = RequestMethod.GET)
    public @ResponseBody String writePage() {

        return "some content";
    }

и мой перехватчик реализован так (упрощенная версия):

public class MultiLangInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {

        String requestUrl = request.getRequestURI().substring(request.getContextPath().length());

        if ("/de/auto".equals(requestUrl)) {
            String redirect = request.getContextPath() + "/en/car";

            response.sendRedirect(redirect);
            return false;
        }
        return true;        
    }
}

Теперь, когда я получаю доступ к /en/car url в браузере, возвращается правильная страница (с сообщением «некоторый контент»), и в журналах показывается, что запрос прошел через мой перехватчик. Когда я получаю доступ к /de/auto, возвращается ошибка 404 и, согласно журналу, запрос не дошел до моего перехватчика. Но почему? Не должен ли запрос пройти через все перехватчики, пока один из них не остановит его, вернув false?

Для ясности я не использую mvc:annotation-driven, потому что скрывал мой пользовательский перехватчик . Я определил все инструкции

<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <ref bean="multiLangInterceptor" />
    </property>
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jacksonMessageConverter"/>
            <ref bean="stringHttpMessageConverter"/>
        </list>
    </property>
</bean>

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

<bean id="multiLangInterceptor" class="example.MultiLangInterceptor" />    

<bean id="stringHttpMessageConverter" 
    class="org.springframework.http.converter.StringHttpMessageConverter"/> 

Спасибо за ответы!

1 Ответ

5 голосов
/ 26 июля 2011

Он не может отправлять каждый входящий запрос перехватчикам, прежде чем определить, есть ли сопоставление.Обратите внимание, что одним из аргументов перехватчика является сам Контроллер!Если входящий URL-адрес нигде не отображается, как он должен знать, какой обработчик будет передаваться в качестве аргумента метода?Перезапись URL должна быть выполнена дальше вверх по стеку, прежде чем запрос попадет в сервлет диспетчера.Например, в фильтре сервлетов для этой цели .

Другим возможным вариантом является сопоставление вашего контроллера таким образом

@RequestMapping(value="/{languageCode}/car", method = RequestMethod.GET)

Пока у вас нет другихсопоставления / что-то / машина в том же диспетчере, который будет сталкиваться.

...