详解获取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(Classclazz){
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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。