详解获取Spring MVC中所有RequestMapping以及对应方法和参数
在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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)