Spring 3 HandlerInterceptorAdapter. Anfrage endet mit 404 beforecalling interceptor
Ich bin writting benutzerdefinierten handler interceptor um multilangual url-Adressen. Zum Beispiel, wenn der Benutzer greift auf uri /de/auto
deutsch Inhalt wird angezeigt, wenn der Benutzer auf /en/car
dann englische Inhalt angezeigt wird. Ich will beide Anfragen umleiten, um den gleichen controller und die gleiche Methode:
@Controller
public class MultiLangController {
@RequestMapping(value="/en/car", method = RequestMethod.GET)
public @ResponseBody String writePage() {
return "some content";
}
und mein interceptor implementiert ist, wie dieses (vereinfachte version):
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;
}
}
Nun, wenn ich auf /en/car
url im browser, die richtige Seite zurückgegeben (mit Meldung "einige Inhalte") und die Protokolle zeigt, dass die Anfrage kam mir in den interceptor. Wenn ich auf /de/auto
, 404-Fehler zurückgegeben, und laut logs Antrag schaffte es nicht auf meinem interceptor. Aber warum? Sollte keine Anfrage gehen Sie durch alle Abfangjäger bis einer von Ihnen hält es durch Rückgabe von false?
Zur Klarheit, ich bin nicht mit mvc:annotation-driven
denn es war investieren wollte, verheimlichte meine custom-interceptor. Ich habe alle Händisch
<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"/>
Danke für die Antworten!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es kann nicht wirklich senden Sie jede einzelne eingehende Anfrage an den Abfangjäger vor der Bestimmung, wenn es eine Zuordnung. Beachten Sie, dass eines der Argumente der interceptor ist der Controller selbst! Wenn der URL, die kommen in eine, die nicht zugeordnet werden überall, wie soll es wissen, was handler, wäre zu übergeben, als eine Methode argument? URL-rewriting getan werden muss, um weiter oben auf dem Stapel, bevor die Anforderung trifft das dispatcher-servlet. E. G., in einem servlet-filter für diesen Zweck.
Eine andere Möglichkeit ist zum zuordnen der Controller diese Weise
Solange Sie nicht über andere Zuordnungen von /etwas/Auto in der gleichen dispatcher, die kollidieren werden.