首页 > 开发 > Java > 正文

详解获取Spring MVC中所有RequestMapping以及对应方法和参数

2024-07-13 10:05:31
字体:
来源:转载
供稿:网友

在Spring MVC中想要对每一个URL进行权限控制,不想手工整理这样会有遗漏,所以就动手写程序了。代码如下:

  /**   * @return    * @author Elwin ZHANG   * 创建时间:2017年3月8日 上午11:48:22   * 功能:返回系统中的所有控制器映射路径,以及对应的方法   */  @RequestMapping(value = "/maps", produces = "application/json; charset=utf-8")  @ResponseBody   public Object getMapPaths(){    String result="";     RequestMappingHandlerMapping rmhp = springHelper.getObject(RequestMappingHandlerMapping.class);       Map<RequestMappingInfo, HandlerMethod> map = rmhp.getHandlerMethods();       for(RequestMappingInfo info : map.keySet()){         result +=info.getPatternsCondition().toString().replace("[", "").replace("]", "")+ "/t"   ;        HandlerMethod hm=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";       }     return result;  }

getMethodParams是专门用于获取方法中参数名称的函数,因为用Java自身的反射功能是获取不到的,浪费我不少时间,后来网上看到JBOSS的JAVAssist类可以。其实这个JAVAssist类库也被封装在Mybatis中,如果系统使用了Mybatis,则直接引入可以使用了。

import org.apache.ibatis.javassist.*;import org.apache.ibatis.javassist.bytecode.*;

getMethodParams 的实现如下:

/**   * @param className 类名   * @param methodName 方法名   * @return 该方法的声明部分   * @author Elwin ZHANG   * 创建时间:2017年3月8日 上午11:47:16   * 功能:返回一个方法的声明部分,包括参数类型和参数名   */  private String getMethodParams(String className,String methodName){    String result="";    try{      ClassPool pool=ClassPool.getDefault();       ClassClassPath classPath = new ClassClassPath(this.getClass());       pool.insertClassPath(classPath);      CtMethod cm =pool.getMethod(className, methodName);      // 使用javaassist的反射方法获取方法的参数名       MethodInfo methodInfo = cm.getMethodInfo();       CodeAttribute codeAttribute = methodInfo.getCodeAttribute();       LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);       result=cm.getName() + "(";      if (attr == null) {         return result + ")";      }       CtClass[] pTypes=cm.getParameterTypes();      String[] paramNames = new String[pTypes.length];       int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;       for (int i = 0; i < paramNames.length; i++) {        if(!pTypes[i].getSimpleName().startsWith("HttpServletRe")){          result += pTypes[i].getSimpleName();          paramNames[i] = attr.variableName(i + pos);           result += " " + paramNames[i]+",";         }      }      if(result.endsWith(",")){        result=result.substring(0, result.length()-1);      }      result+=")";    }catch(Exception e){      e.printStackTrace();    }    return result;  }

这样就可以获得每个URL路径与期对应的方法声明了。

另外SpringHelper是自己封装的Spring工具类,可以用来直接获取Spring管理的Bean,代码如下:

import java.util.Locale;import javax.servlet.http.HttpServletRequest;import org.apache.log4j.Logger;import org.springframework.beans.BeansException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;import org.springframework.web.servlet.i18n.CookieLocaleResolver;/** * @author Elwin ZHANG  * 创建时间:2016年4月14日 上午9:12:13  * 功能:Spring 工具类,用于获取Spring管理的Bean */@Componentpublic class SpringHelper implements ApplicationContextAware {  // 日志输出类  private static Logger logger = Logger.getLogger(SpringHelper.class);  // 当前的Spring上下文  private static ApplicationContext applicationContext;  @Override  public void setApplicationContext(ApplicationContext arg0)      throws BeansException {    applicationContext = arg0;  }  /**   * @param beanName bean Id   * @return 如果获取失败,则返回Null   * @author Elwin ZHANG   * 创建时间:2016年4月14日 上午9:52:55   * 功能:通过BeanId获取Spring管理的对象   */  public Object getObject(String beanName) {    Object object = null;    try {      object = applicationContext.getBean(beanName);    } catch (Exception e) {      logger.error(e);    }    return object;  }  /**   * @return    * @author Elwin ZHANG   * 创建时间:2017年3月7日 下午3:44:38   * 功能:获取Spring的ApplicationContext   */  public ApplicationContext getContext() {    return applicationContext;  }  /**   * @param clazz 要获取的Bean类   * @return 如果获取失败,则返回Null   * @author Elwin ZHANG   * 创建时间:2016年4月14日 上午10:05:27   * 功能:通过类获取Spring管理的对象   */  public <T> T getObject(Class<T> clazz) {    try {      return applicationContext.getBean(clazz);    } catch (Exception e) {      logger.error(e);    }    return null;  }/** * @param code 配置文件中消息提示的代码 * @param locale 当前的语言环境 * @return 当前语言对应的消息内容 * @author Elwin ZHANG * 创建时间:2016年4月14日 上午10:34:25 * 功能:获取当前语言对应的消息内容 */  public String getMessage(String code,Locale locale){    String message;    try{      message=applicationContext.getMessage(code, null, locale);    }catch(Exception e){      logger.error(e);      message="";    }    return message;  }  /**   *    * @param code 配置文件中消息提示的代码   * @param request 当前的HTTP请求   * @return 当前语言对应的消息内容   * @author Elwin ZHANG   * 创建时间:2016年4月14日 下午3:03:37   * 功能:获取当前语言对应的消息内容   */  public String getMessage(String code,HttpServletRequest request){    String message;    try{      message=applicationContext.getMessage(code, null, getCurrentLocale(request));    }catch(Exception e){      logger.error(e);      message="zh_CN";    }    return message;  }  /**   * @param request 当前的HTTP请求   * @return 当前用户Cookie中的语言   * @author Elwin ZHANG   * 创建时间:2016年4月14日 下午2:59:21   * 功能:当前用户保存Cookie中的默认语言   */  public Locale getCurrentLocale(HttpServletRequest request){    return resolver.resolveLocale(request);  }  //Cookie本地语言解析器,Spring提供  @Autowired  CookieLocaleResolver resolver;}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表