spring aop、@PathVarable


もっと読む
開発中にページが欲しいです.ユーザーが選択した言語によって異なる言語の文字を表示します.
国際化に関する技術:http://slnddd.iteye.com/admin/blogs/2339737
前の文章で使われているurl形式は127.1.0.1:8080/list?lang=enです.
でもなんだかよくないです.レジュful風のurlに変えたいです.  : 127.1.0.1:8080/en/listこのような
 
また、Request Mappingページごとにジャンプする方法が欲しいので、現在のlangをフロントに届けることができます.
@Aspect
@Component
public class ControllerInterceptor {
    //         request,response,model,lang requestMapping  
    @Pointcut("execution(* com.xxxx.xxxx.xxxx.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)")  
    public void excute(){}
    
    @Around("excute() && args(request,response,model,lang,..)")
    public ModelAndView around(ProceedingJoinPoint joinPoint,HttpServletRequest request,HttpServletResponse response,ModelAndView model,String lang) throws Throwable {
        
        Object[] args = joinPoint.getArgs();
        joinPoint.getArgs()[3] = lang;
        joinPoint.proceed(args); 
        
        model.addObject("lang", lang);
        
        return model;
    }
    
}
   
//       
   @RequestMapping(value = "/{lang:en|zh}/list")
    public ModelAndView list(HttpServletRequest request,HttpServletResponse response,ModelAndView model,@PathVariable String lang) {
     
        model.setViewName("index");
        
        return model;
        
    }
 このようなパラメータ付きのurlは@PathVarableがないと127.1.0.1:8080/en/listという形でaopでは取得できません.@PathVarableを加えると取得できます.
 
つまり127..0.1:8080/lang'/listという形では、まずパラメータを伝えなければなりません.そうでなければ、直接404です.そして@PathVarableを使う必要があります.
 
もう一つ不思議なのはString langという形では伝わりませんが、対象のタイプのbeanであれば伝わります.プログラムが実行されている時に127.1.0.1:8080/lang'/listというタイプのurlが発見された時に、まずパラメータの中に@PathVarableの注釈がありますか?beanオブジェクトは、同じ名前のものを直接検索して賦課します.