详解获取Spring MVC中所有RequestMapping以及对应方法和参数
在SpringMVC中想要对每一个URL进行权限控制,不想手工整理这样会有遗漏,所以就动手写程序了。代码如下:
/** *@return *@authorElwinZHANG *创建时间:2017年3月8日上午11:48:22 *功能:返回系统中的所有控制器映射路径,以及对应的方法 */ @RequestMapping(value="/maps",produces="application/json;charset=utf-8") @ResponseBody publicObjectgetMapPaths(){ Stringresult=""; RequestMappingHandlerMappingrmhp=springHelper.getObject(RequestMappingHandlerMapping.class); Mapmap=rmhp.getHandlerMethods(); for(RequestMappingInfoinfo:map.keySet()){ result+=info.getPatternsCondition().toString().replace("[","").replace("]","")+"\t"; HandlerMethodhm=map.get(info); result+=hm.getBeanType().getName()+"\t"; result+=getMethodParams(hm.getBeanType().getName(),hm.getMethod().getName())+"\t"; result+=info.getProducesCondition().toString().replace("[","").replace("]","")+"\t"; result+="\r\n"; } returnresult; }
getMethodParams是专门用于获取方法中参数名称的函数,因为用Java自身的反射功能是获取不到的,浪费我不少时间,后来网上看到JBOSS的JAVAssist类可以。其实这个JAVAssist类库也被封装在Mybatis中,如果系统使用了Mybatis,则直接引入可以使用了。
importorg.apache.ibatis.javassist.*; importorg.apache.ibatis.javassist.bytecode.*;
getMethodParams的实现如下:
/** *@paramclassName类名 *@parammethodName方法名 *@return该方法的声明部分 *@authorElwinZHANG *创建时间:2017年3月8日上午11:47:16 *功能:返回一个方法的声明部分,包括参数类型和参数名 */ privateStringgetMethodParams(StringclassName,StringmethodName){ Stringresult=""; try{ ClassPoolpool=ClassPool.getDefault(); ClassClassPathclassPath=newClassClassPath(this.getClass()); pool.insertClassPath(classPath); CtMethodcm=pool.getMethod(className,methodName); //使用javaassist的反射方法获取方法的参数名 MethodInfomethodInfo=cm.getMethodInfo(); CodeAttributecodeAttribute=methodInfo.getCodeAttribute(); LocalVariableAttributeattr=(LocalVariableAttribute)codeAttribute.getAttribute(LocalVariableAttribute.tag); result=cm.getName()+"("; if(attr==null){ returnresult+")"; } CtClass[]pTypes=cm.getParameterTypes(); String[]paramNames=newString[pTypes.length]; intpos=Modifier.isStatic(cm.getModifiers())?0:1; for(inti=0;i这样就可以获得每个URL路径与期对应的方法声明了。
另外SpringHelper是自己封装的Spring工具类,可以用来直接获取Spring管理的Bean,代码如下:
importjava.util.Locale; importjavax.servlet.http.HttpServletRequest; importorg.apache.log4j.Logger; importorg.springframework.beans.BeansException; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.context.ApplicationContext; importorg.springframework.context.ApplicationContextAware; importorg.springframework.stereotype.Component; importorg.springframework.web.servlet.i18n.CookieLocaleResolver; /** *@authorElwinZHANG *创建时间:2016年4月14日上午9:12:13 *功能:Spring工具类,用于获取Spring管理的Bean */ @Component publicclassSpringHelperimplementsApplicationContextAware{ //日志输出类 privatestaticLoggerlogger=Logger.getLogger(SpringHelper.class); //当前的Spring上下文 privatestaticApplicationContextapplicationContext; @Override publicvoidsetApplicationContext(ApplicationContextarg0) throwsBeansException{ applicationContext=arg0; } /** *@parambeanNamebeanId *@return如果获取失败,则返回Null *@authorElwinZHANG *创建时间:2016年4月14日上午9:52:55 *功能:通过BeanId获取Spring管理的对象 */ publicObjectgetObject(StringbeanName){ Objectobject=null; try{ object=applicationContext.getBean(beanName); }catch(Exceptione){ logger.error(e); } returnobject; } /** *@return *@authorElwinZHANG *创建时间:2017年3月7日下午3:44:38 *功能:获取Spring的ApplicationContext */ publicApplicationContextgetContext(){ returnapplicationContext; } /** *@paramclazz要获取的Bean类 *@return如果获取失败,则返回Null *@authorElwinZHANG *创建时间:2016年4月14日上午10:05:27 *功能:通过类获取Spring管理的对象 */ publicTgetObject(Class clazz){ try{ returnapplicationContext.getBean(clazz); }catch(Exceptione){ logger.error(e); } returnnull; } /** *@paramcode配置文件中消息提示的代码 *@paramlocale当前的语言环境 *@return当前语言对应的消息内容 *@authorElwinZHANG *创建时间:2016年4月14日上午10:34:25 *功能:获取当前语言对应的消息内容 */ publicStringgetMessage(Stringcode,Localelocale){ Stringmessage; try{ message=applicationContext.getMessage(code,null,locale); }catch(Exceptione){ logger.error(e); message=""; } returnmessage; } /** * *@paramcode配置文件中消息提示的代码 *@paramrequest当前的HTTP请求 *@return当前语言对应的消息内容 *@authorElwinZHANG *创建时间:2016年4月14日下午3:03:37 *功能:获取当前语言对应的消息内容 */ publicStringgetMessage(Stringcode,HttpServletRequestrequest){ Stringmessage; try{ message=applicationContext.getMessage(code,null,getCurrentLocale(request)); }catch(Exceptione){ logger.error(e); message="zh_CN"; } returnmessage; } /** *@paramrequest当前的HTTP请求 *@return当前用户Cookie中的语言 *@authorElwinZHANG *创建时间:2016年4月14日下午2:59:21 *功能:当前用户保存Cookie中的默认语言 */ publicLocalegetCurrentLocale(HttpServletRequestrequest){ returnresolver.resolveLocale(request); } //Cookie本地语言解析器,Spring提供 @Autowired CookieLocaleResolverresolver; } 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。