详解获取Spring MVC中所有RequestMapping以及对应方法和参数
作者:Y橡树Y 发布时间:2023-12-09 21:29:17
标签: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;
}
来源:http://www.jianshu.com/p/bb9e0c402341#


猜你喜欢
- Android Studio 是谷歌基于IntelliJ IDEA开发的安卓开发工具,有点类似 EcliPSe ADT,Android St
- mybatis group by substr传参报错报异常### Cause: java.sql.SQLSyntaxErrorExcept
- 记录web项目部署到阿里云服务器步骤(使用 web项目、阿里云服务器、Xftp、Xshell),敬请参考和指正1.将要部署的项目打包成WAR
- Spring @Cacheable指定失效时间新版本配置@Configuration@EnableCachingpublic class R
- (一).前言: 这两天QQ进行了重大更新(6.X)尤其在UI风格上面由之前的蓝色换成了白色居多了,侧滑效果也发生了一些变化,那我们今天来模仿
- 每次滑动至底端,从数据库中获取10条数据,并加载于ListView中数据库package com.example.listviewbatch
- 什么是斐波那契数列?经典数学问题之一;斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……想必看到这
- 俄罗斯方块Tetris是一款很经典的益智游戏,之前就做了一款桌面版的java俄罗斯方块,这次就尝试着写了一款适用于Android平台的俄罗斯
- 一、基本使用1、准备工程和引入控件1、下载、安装FastReport这一步很简单,大家在其中文网站上下载最新版的demo版就可以了,直接安装
- 一、效果图本控件已上传Github,欢迎Star和Fork,项目地址:CircleWaterWaveView二、设计思路观察效果图,可以看出
- Android 侧滑菜单的实现,参考网上的代码,实现侧滑菜单。最重要的是这个动画类UgcAnimations,如何使用动画类来侧滑的封装Fl
- 以前一直接触.net相关的web开发,现在猛然使用javaWeb还是很不习惯,就连搭个框架也是第一次。一、谈谈项目架构一开始接触.net相关
- C#学习笔记- 浅谈数组复制,排序,取段,元组using System;using System.Collections.Generic;n
- 本文实例讲述了Android编程之手机壁纸WallPaper设置方法。分享给大家供大家参考,具体如下:/** * Andorid设置手机屏幕
- using System;using System.Collections.Generic;using System.Data;using
- 前言项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方
- 本文实例为大家分享了Android实现指针刻度转盘的具体代码,供大家参考,具体内容如下一. 先上个效果图,实现如图所示刻度转盘和2个文本的绘
- 1、此文初衷平常我们在进行微服务开发完毕后,单个微服务理应部署单个虚机上(docker也可),然后服务集中发布到服务注册中心上,但是有些小的
- 一、举个栗子public class BeanServiceImpl implements BeanService {}@Configura
- a.在.xaml文件中拖入一个datagrid,然后添加列名,使用Binding="{Binding 数据库中的列名称}"