摘要:前言和切面一样,在项目中同样使用了自定义注解,目前项目中使用的自定义注解主要分为以下一些方面参数解析,缓存方法声明,导入功能中的声明。
前言
和切面一样,在项目中同样使用了自定义注解,目前项目中使用的自定义注解主要分为以下一些方面:controller参数解析,缓存方法声明,导入功能中的POJO声明。
@JsonObject用在controller的方法参数,解析前台提交的json参数,组装成java对象。用法如下:
@PostMapping("/bas/user/status/toggle") public PackVo toggleUserStatus(@JsonObject Long[] userIds , @JsonObject Long status ){ ... }
注解声明
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface JsonObject { String value() default ""; boolean required() default true; }
注解处理,实现HandlerMethodArgumentResolver,
public class JsonArgumentResolver implements HandlerMethodArgumentResolver { public static Logger logger = LoggerFactory.getLogger(JsonArgumentResolver.class); @Override public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.hasParameterAnnotation(JsonObject.class); } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { try { JSONObject para = getRequestInfo(nativeWebRequest); Class> type = methodParameter.getParameterType(); String name = methodParameter.getParameterName(); //获取参数注解JsonObject,如果为空,则使用参数名,不为空,则使用注解中的value Annotation[] annotations = methodParameter.getParameterAnnotations(); for(Annotation annotation : annotations){ if(annotation instanceof JsonObject){ String value = ((JsonObject) annotation).value(); if(StringUtils.isNotEmpty(value)){ name = value; } } } if (null != para && para.containsKey(name)) { if (String.class.equals(type)) { return para.getString(name); } if (List.class.equals(type)) { String typeName = methodParameter.getGenericParameterType().getTypeName(); typeName = typeName.substring(typeName.indexOf("<")+1); typeName =typeName.substring(0,typeName.length()-1); return JSON.parseArray(para.getString(name), Class.forName(typeName)); } return JSON.parseObject(para.getString(name), type); } } catch (Exception e) { e.printStackTrace(); logger.info("",e); } return null; } private JSONObject getRequestInfo(NativeWebRequest webRequest) throws IOException { JSONObject para = new JSONObject(); HttpServletRequest httpServletRequest = webRequest.getNativeRequest(HttpServletRequest.class); String method = httpServletRequest.getMethod(); if (!method.equals("GET") && !method.equals("DELETE")) { if (null != httpServletRequest.getAttribute("para")) { try { para = JSON.parseObject(httpServletRequest.getAttribute("para").toString()); } catch (Exception e) { e.printStackTrace(); logger.info("",e); } } else { StringBuilder buffer = new StringBuilder(); BufferedReader reader = httpServletRequest.getReader(); String line; while ((line = reader.readLine()) != null) { buffer.append(line); } httpServletRequest.setAttribute("para", buffer.toString()); try { para = JSON.parseObject(buffer.toString()); } catch (Exception e) { e.printStackTrace(); logger.info("",e); } } } else { Map@RedisCacheparameterMap = webRequest.getParameterMap(); for (Map.Entry entry : parameterMap.entrySet()) { String key = entry.getKey(); String values = StringUtils.join(entry.getValue()); para.put(key, values); } } return para; } }
接口使用方式如下:
注解声明,具体的注解处理在上一篇的DAO切面中有写到。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface RedisCache { String value() default ""; boolean required() default true; }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68466.html
摘要:前言目前系统刚启动,骨架刚刚搭建完成,在项目中,使用了一些切面,做一些业务无关的处理。在现在的项目里面,分别在,调用,分页,处理,均使用到了切面。希望本文的阅读者也不吝将项目中使用的切面分享出来。 前言 目前系统刚启动,骨架刚刚搭建完成,在项目中,使用了一些切面,做一些业务无关的处理。在本文中,将各个切面例举出来,用以加深自己对切面的理解。记得在初学切面的时候,一般文章介绍切面的时候,...
摘要:示例代码如下添加的设置默认的配置对应的是原来的如何使用注解从主库到备库的切换 摘要: 本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的压力,在本篇文章中主要记录在Spring Boot中通过自定义注解结合AOP实现直接连接备库查询。 一.通过A...
摘要:生产环境服务器环境搭建安装安装在系统中通过以下命令输入查看是否安装正确,输出如下创建发布目录,并给出相应的权限服务器和后台文件夹上传前端文件夹改变文件所有权文件的所有权变为加入参数,文件夹以及文件夹里的所有 生产环境服务器环境搭建 安装jdk 安装 openjdk-8-jdk 在 ubuntu-16.04 系统中通过以下命令: 1.sudo add-apt-repository pp...
阅读 2445·2021-10-13 09:40
阅读 3333·2019-08-30 13:46
阅读 1119·2019-08-29 14:05
阅读 2952·2019-08-29 12:48
阅读 3653·2019-08-26 13:28
阅读 2141·2019-08-26 11:34
阅读 2276·2019-08-23 18:11
阅读 1154·2019-08-23 12:26