欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-05 10:05:12
在spring mvc中想要对每一个url进行权限控制,不想手工整理这样会有遗漏,所以就动手写程序了。代码如下: /** * @return...

在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
 */
@component
public 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;
}

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