多言語URLアドレスを持つためにカスタムハンドラインターセプタを作成しています。たとえば、ユーザーがuri /de/auto
にアクセスするとdeutschのコンテンツが表示され、ユーザーが/en/car
にアクセスすると英語のコンテンツが表示されます。Spring 3 HandlerInterceptorAdapter。リクエストは404で終了し、インターセプタを呼び出す前に
@Controller
public class MultiLangController {
@RequestMapping(value="/en/car", method = RequestMethod.GET)
public @ResponseBody String writePage() {
return "some content";
}
と私のインターセプタは、この(簡易版)のように実装されています:今、私は、ブラウザで/en/car
URLにアクセスすると、正しいページがある
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;
}
}
私は両方の要求は、同じコントローラと同じ方法にリダイレクトしたいです返されたメッセージ(「some content」というメッセージ)とログは、その要求が私のインターセプタを通過したことを示します。私が/de/auto
にアクセスすると、404エラーが返され、ログの要求に応じて私のインターセプタにそれが反映されませんでした。 しかし、なぜですか?いずれかの傍受者が偽を返すことによってそれを停止するまで、すべての傍受者を要求する必要はありませんか?
mvc:annotation-driven
はわかりやすくするため、hidding my custom interceptorであるため、使用していません。私はすべてマニュアルで定義しました
<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"/>
ありがとうございました!