您的位置:首页 > 编程语言 > Java开发

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

2017-03-07 00:00 856 查看

在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;
}

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

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring MVC RequestMapping