Spring boot 少量字段不使用对象接收 自定义注解转成JSON格式
一 自定义注解
/*** @author qujiawen* @version 1.0.0* @ClassName RequestJson.java* @Description TODO* @createTime 2021年11月24日 13:55:00*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestJson {@AliasFor("name")String value() default "";@AliasFor("value")String name() default "";boolean required() default false;String defaultValue() default "";
}
二 编写自定义参数解析器
/*** @author qujiawen* @version 1.0.0* @ClassName RequestJsonHandler.java* @Description TODO* @createTime 2021年11月24日 13:53:00*/
@Slf4j
@Component
public class RequestJsonHandler implements HandlerMethodArgumentResolver {ThreadLocal<JSONObject> paramObject = new ThreadLocal<>();@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {return methodParameter.hasParameterAnnotation(RequestJson.class);}@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {JSONObject jsonObject = getJsonObject();Object o = jsonObject.get(methodParameter.getParameterName());RequestJson parameterAnnotation = methodParameter.getParameterAnnotation(RequestJson.class);//判断是否允许为空String message = String.format("参数%s不能为空", methodParameter.getParameterName());Assert.isFalse(parameterAnnotation.required() && o == null, message);//如果为空设置默认值if (o == null) {return convertParameter(methodParameter, parameterAnnotation.defaultValue());}return convertParameter(methodParameter, o);}private Object convertParameter(MethodParameter methodParameter, Object o) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {if (methodParameter.getParameterType().getTypeName().equals(List.class.getTypeName()) ||methodParameter.getParameterType().getTypeName().equals(Set.class.getTypeName())) {Type actualTypeArgument = ((ParameterizedTypeImpl) methodParameter.getGenericParameterType()).getActualTypeArguments()[0];return JSONUtil.toList((JSONArray) o, Class.forName(actualTypeArgument.getTypeName()));} else {return convertParameter(methodParameter, String.valueOf(o));}}private Object convertParameter(MethodParameter methodParameter, String obj) throws InstantiationException, IllegalAccessException, InvocationTargetException {Constructor<?>[] constructors = methodParameter.getParameterType().getConstructors();for (Constructor<?> constructor : constructors) {if (constructor.getParameterCount() == 1 && constructor.getParameters()[0].getParameterizedType().getTypeName().equals("java.lang.String")) {return constructor.newInstance(obj);}}return null;}private JSONObject getJsonObject() throws IOException {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));StringBuilder responseStrBuilder = new StringBuilder();String inputStr;while ((inputStr = streamReader.readLine()) != null) {responseStrBuilder.append(inputStr);}String jsonStr = responseStrBuilder.toString();//如果没有参数,表示不是第一次进入if (StrUtil.isEmpty(jsonStr)) {return paramObject.get();}JSONObject jsonObject = JSONUtil.parseObj(jsonStr);paramObject.set(jsonObject);return jsonObject;}
}
三 注册自定义的参数解析器
/*** @author qujiawen* @version 1.0.0* @ClassName * @Description TODO* @createTime 2021年11月24日 14:46:00*/
@Configuration
public class RequestJsonHandlerConfig implements WebMvcConfigurer {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(new RequestJsonHandler());WebMvcConfigurer.super.addArgumentResolvers(resolvers);}
}
四 测试
能查到的大多数都只是支持一个字段转成JSON 此方法可以支持多个字段,大于3个参数还是建议使用对象对接收
补充一下我用的Hutool的工具类去实现的
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version> 5.7.16</version></dependency>
本是摸鱼人 水平有限 有不对的地方多多包容
Spring boot 少量字段不使用对象接收 自定义注解转成JSON格式相关推荐
- Spring Boot2.x-09 基于Spring Boot 2.1.2 + Mybatis使用自定义注解实现数据库切换
文章目录 概述 场景说明:读写分离 操作步骤 工程结构 Step1 自定义注解 Step2 数据源定义 Step3 配置文件配置数据源 Step4 数据源实例化DatasourceConfig Ste ...
- Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
Spring boot异常统一处理方法:@ControllerAdvice注解的使用.全局异常捕获.自定义异常捕获 参考文章: (1)Spring boot异常统一处理方法:@ControllerAd ...
- spring boot框架学习学前掌握之重要注解(2)-通过java的配置方式进行配置spring
本节主要内容: 1:通过代码演示实现零XML配置spring 2:使用重点注解理解 声明: 本文是<凯哥陪你学系列-框架学习之spring boot框架学习>中spring boot框架学 ...
- Jackson 通过自定义注解来控制json key的格式
Jackson 通过自定义注解来控制json key的格式 最近我这边有一个需求就是需要把Bean中的某一些特殊字段的值进行替换.而这个替换过程是需要依赖一个第三方的dubbo服务的.为了使得这个转换 ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- Spring Boot端口从默认更改为自定义或新端口
更改Spring Boot应用程序端口的快速指南. application.properties文件和yml文件中的server.port属性的示例. 以及从命令行参数@ SpringBootAppl ...
- Spring Boot基础学习笔记22:自定义用户控制、登录与退出
文章目录 零.学习目标 一.准备工作 (一)创建Spring Boot项目 - UserControlDemo01 (二)移植AuthenticationDemo的内容到当前项目 (三)启动应用,测试 ...
- Spring Boot基础学习笔记21:自定义用户认证
文章目录 零.学习目标 一.Spring Security认证流程图 二.准备工作 (一)创建Spring Boot项目 - AuthenticationDemo (二)移植SpringSecurit ...
- Spring Boot基础学习笔记19:自定义RedisTemplate与RedisCacheManager
文章目录 零.学习目标 一.为什么要采用自定义Redis缓存序列化机制 二.自定义RedisTemplate (一)Redis API 默认序列化机制 (二)自定义RedisTemplate序列化机制 ...
最新文章
- python time 时钟计时_如何使用Python的timeit计时代码段以测试性能?
- 02-Wifi通讯架构介绍
- centos下安装 php,Centos 下安装 PHP (新)
- linux 8051 编译,[编译] 3、在Linux下搭建51单片机的开发烧写环境(makefile版)
- HTML 5 的自定义 data-* 属性和jquery的data()方法的使用
- java http 返回码_【Java】Http返回状态码
- java字符连接字符串数组_Java中连接字符串的最佳方法
- [Java] 蓝桥杯 BASIC-10 基础练习 十进制转十六进制
- zedboard板子上呼吸灯的实现(第一版)仿真代码的实现
- Android源码编译到/data/app方法
- be服务器未正常运行5.4.15,RHEL5.4 DNS服务器配置详解(一)
- C#【高级篇】 IntPtr是什么?怎么用?
- 私域运营如何做到高转化高复购?快鲸scrm必不可少
- oracle数据库技术_创建 pdb数据库
- Python 爬取笔趣阁小说
- BitTorrent Sync简介
- android Acitvity action,flag和category各个参数的说明 .
- codelite14中文语言包_codelite中文版-codelite下载(开源的C++跨平台开发环境) 13.0.7 中文版 - 河东下载站...
- 用python提取字符串的中英文——建议收藏反复观看
- 国外网络需要验证中国手机号码的格式(获取手机的验证码时)(kaggle 收不到手机验证码)
热门文章
- windows下nginx-http-flv-module的nginx集成环境的傻瓜式部署
- Android硬编、硬解h264
- 用云计算重构CFO的管理世界
- 百款蓝牙耳机试用测评:这五款高性价比蓝牙耳机更值得入手
- 程序员秘籍之九阴真经
- 计算机辅助教学在语文上应用,计算机辅助教学在语文教学过程中的运用-小学语文论文-语文论文-教师论文.docx...
- Centos DHCP服务的搭建
- 3D游戏建模需要学多久才能做出高精模型?学了能就业吗?
- 《徐汇区推动数字广告产业高质量发展的扶持意见》的通知
- XSS-14、15注入靶场闯关(小游戏)——第十四、五关