2011-07-26 10 views
1

多言語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"/> 

ありがとうございました!

答えて

5

マッピングがあるかどうかを判断する前に、すべての単一の着信要求をインターセプタに実際に送信することはできません。インターセプタへの引数の1つがコントローラ自体であることに注意してください。入ってくるURLがどこにもマップされていないURLの場合、メソッドの引数として渡すハンドラをどのように知ることになっていますか?要求がディスパッチャサーブレットにヒットする前に、URLの書き換えをスタック上でさらに実行する必要があります。 E.G.、servlet filter for that purpose

別の可能なオプションでは、衝突する同じディスパッチャで/何か/車の他のマッピングを持っていない限り、このようにあなたコントローラー

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

をマッピングすることです。

関連する問題