Spring AOP注解的方式校验参数
来源:互联网 发布:java array contains 编辑:程序博客网 时间:2024/05/23 14:18
简介:
大家应该对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@Componentpublic 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"/>
阅读全文
0 0
- Spring AOP注解的方式校验参数
- spring aop参数校验
- spring aop 注解方式
- 基于注解和Aop的自动参数校验的实现
- Spring -- 通过拦截器使用注解方式校验参数
- 使用Spring的注解方式实现AOP
- 使用Spring的注解方式实现AOP
- 使用Spring的注解方式实现AOP
- Spring使用注解的方式实现AOP
- 使用Spring的注解方式实现AOP
- 使用Spring的注解方式实现AOP
- 使用Spring的注解方式实现AOP
- 使用Spring的注解方式实现AOP
- 注解方式使用spring aop的步骤
- spring中aop的注解配置方式
- Spring-注解的方式配置AOP-案例
- 应用Spring的注解方式实现AOP
- 注解方式实现Spring的aop
- Cookie和Session
- containsKey用法
- 避免循环嵌套
- CentOS Maven配置
- 五天面试 Google、Facebook、Airbnb 等硅谷五家顶级公司,我是如何都拿到 Offer 的
- Spring AOP注解的方式校验参数
- 购物加减与全部选中
- springMvc+AJAX+JSON的增删改查
- 接口压力测试软件jmeter
- 简单的程序猿表白 图片隐写 --颜色通道的微改
- JDBC02
- H5/C3之2D转换
- Windows游戏开发之击球小游戏
- C# WEBSOCKET FLECK 调用非托管C++ DLL 实现通信(使用CHAR*接收)