Spring AOP注解的方式校验参数
2017-11-30 16:29
513 查看
简介:
大家应该对Spring并不陌生,而且对Spring AOP也一样不陌生。本章讲解使用注解AOP方式去校验参数。首先,介绍一下Spring AOP的原理,Spring AOP采用动态代理实现, 在Spring 容器中的bean被代理对象所代替,代理对象加入了增强逻辑,当调用代理调用对象的方法时,目标对象的方法就会被拦截。该AOP在Controller使用,必须是SpringMVC容器中去管理,也因此存在Spring和SpringMVC父子容器的关系。Spring父容器一般是管理Dao和Service层,而Spring的子容器一般配置的是Controller层,父子容器的访问关系是,子容器可以访问父容器中的对象,但是父容器无法访问子容器中的对象。比如controller可以把Dao和Service注入进来,但是Dao和Service无法把Controller注进来。实践:
直接上代码,依赖jar这里不在赘述。注解类:
@Retention(RetentionPolicy.RUNTIME)//@Retention定义了该Annotation被保留的时间长短,用于描述注解的生命周期 @Target(ElementType.METHOD)//@Target说明了Annotation所修饰的对象范围 public @interface CheckParam { /** * 请求当前接口所需要的参数,多个以小写的逗号隔开 * @return */ String fieldNames() default ""; /** *传递参数的对象类型 */ Class<?> parameter() default Object.class; /** * 默认不校验参数; * @return */ boolean require() default false; }
aop类:
@Aspect
@Component
public class RequiredParam {
private static final Logger logger = Logger.getLogger(RequiredParam.class);
public RequiredParam() {
logger.info("初始化AOP切面校验类");
}
@Pointcut("@annotation(com.jeeplus.modules.capital.controller.CheckParam)")
public void controllerRequired() {
}
@Around("controllerRequired()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
try {
//获取被注解的方法
MethodInvocationProceedingJoinPoint mjp = (MethodInvocationProceedingJoinPoint) pjp;
MethodSignature signature = (MethodSignature) mjp.getSignature();
Method method = signature.getMethod();
//获取方法上的注解
CheckParam checkParam = method.getAnnotation(CheckParam.class);
if (!checkParam.require()) {//放行
pjp.proceed();
}
String result = requestParameter();
Gson gson = new Gson();
List<Map> param = gson.fromJson(result, ArrayList.class);
logger.info(String.format("Request Param;{%s}", param));
Preconditions.checkNotNull(param, "request param is null");
//获取方法上的校验字段;以防万一,将中文的逗号替换成英文的逗号;
String fieldNames = checkParam.fieldNames().replace(",", ",");
for (String fieldName : fieldNames.split(",")) {
Preconditions.checkNotNull(param.get(0).get(fieldName),fieldName + " not found");
}
} catch (Exception e) {
e.printStackTrace();
return Result.fail(SysMessageEnums.MISS_REQUEST_PARAM.getVal(),SysMessageEnums.MISS_REQUEST_PARAM.getContext());
}
//如果没有报错,放行
return pjp.proceed();
}
/**
* 获取请求中的数据,通过字符输入流中读取JSON数据
*
* @return
* @throws Exception
*/
public static String requestParameter() throws Exception {
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = sra.getRequest();
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
String jsonStr = null;
StringBuilder result = new StringBuilder();
while ((jsonStr = reader.readLine()) != null) {
result.append(jsonStr);
}
if (StringUtils.isEmpty(result)) {
return ERROR_MESSAGE;
}
return result.toString();
}
private static final String ERROR_MESSAGE = "缺少必要参数";controller类:
@RequestMapping("/txUser")
@Controller("txUserController")
public class TxUserController {
@RequestMapping(value = "/insert")
@CheckParam(fieldNames="name,age",require=true)
public String insert(User user){
System.out.println("参数:" + user);
return "success";
}
}
test类:
public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mvc.xml"); TxUserController ps = ac.getBean("txUserController",TxUserController.class); String str = ps.insert(new User("test",25)); sout(str); }xml配置,这里主要提到一个AOP用到的配置,其它配置不贴了,这个配置一点就是一定要配置在component-scan以注册bean后:
<aop:aspectj-autoproxy proxy-target-class="true"/>
相关文章推荐
- Spring -- 通过拦截器使用注解方式校验参数
- Spring AOP拦截Service实现日志管理(自定义注解的方式)
- 利用Spring AOP (aspect) 自定义注解解决日志和签名校验
- Intellij IDEA创建Spring项目之基于Aspectj的AOP操作(注解方式)
- Spring学习历程---使用注解方式入门AOP
- Spring AOP基础 注解方式
- SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP
- 转:Spring AOP 注解方式实现的一些“坑”
- 转: 利用Spring AOP自定义注解解决日志和签名校验
- 详解SpringBoot AOP 拦截器(Aspect注解方式)
- Spring aop 注解方式怎么获得执行了目标的某个方法?
- spring aop的使用(注解方式以及基于xml配置方式)
- 05 Spring Aop实例(AOP 如此简单)@Aspect、@Around 注解方式配置
- 使用Spring的注解方式实现AOP
- Spring——AOP(面向切面编程)@AspectJ注解方式
- Spring以注解方式使用aop
- spring aop 功能初次使用(注解方式)
- Spring Aop开发基于AspectJ注解方式的案例
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)