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"/>



原创粉丝点击