一 自定义注解

/*** @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格式相关推荐

  1. Spring Boot2.x-09 基于Spring Boot 2.1.2 + Mybatis使用自定义注解实现数据库切换

    文章目录 概述 场景说明:读写分离 操作步骤 工程结构 Step1 自定义注解 Step2 数据源定义 Step3 配置文件配置数据源 Step4 数据源实例化DatasourceConfig Ste ...

  2. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获

    Spring boot异常统一处理方法:@ControllerAdvice注解的使用.全局异常捕获.自定义异常捕获 参考文章: (1)Spring boot异常统一处理方法:@ControllerAd ...

  3. spring boot框架学习学前掌握之重要注解(2)-通过java的配置方式进行配置spring

    本节主要内容: 1:通过代码演示实现零XML配置spring 2:使用重点注解理解 声明: 本文是<凯哥陪你学系列-框架学习之spring boot框架学习>中spring boot框架学 ...

  4. Jackson 通过自定义注解来控制json key的格式

    Jackson 通过自定义注解来控制json key的格式 最近我这边有一个需求就是需要把Bean中的某一些特殊字段的值进行替换.而这个替换过程是需要依赖一个第三方的dubbo服务的.为了使得这个转换 ...

  5. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  6. Spring Boot端口从默认更改为自定义或新端口

    更改Spring Boot应用程序端口的快速指南. application.properties文件和yml文件中的server.port属性的示例. 以及从命令行参数@ SpringBootAppl ...

  7. Spring Boot基础学习笔记22:自定义用户控制、登录与退出

    文章目录 零.学习目标 一.准备工作 (一)创建Spring Boot项目 - UserControlDemo01 (二)移植AuthenticationDemo的内容到当前项目 (三)启动应用,测试 ...

  8. Spring Boot基础学习笔记21:自定义用户认证

    文章目录 零.学习目标 一.Spring Security认证流程图 二.准备工作 (一)创建Spring Boot项目 - AuthenticationDemo (二)移植SpringSecurit ...

  9. Spring Boot基础学习笔记19:自定义RedisTemplate与RedisCacheManager

    文章目录 零.学习目标 一.为什么要采用自定义Redis缓存序列化机制 二.自定义RedisTemplate (一)Redis API 默认序列化机制 (二)自定义RedisTemplate序列化机制 ...

最新文章

  1. python time 时钟计时_如何使用Python的timeit计时代码段以测试性能?
  2. 02-Wifi通讯架构介绍
  3. centos下安装 php,Centos 下安装 PHP (新)
  4. linux 8051 编译,[编译] 3、在Linux下搭建51单片机的开发烧写环境(makefile版)
  5. HTML 5 的自定义 data-* 属性和jquery的data()方法的使用
  6. java http 返回码_【Java】Http返回状态码
  7. java字符连接字符串数组_Java中连接字符串的最佳方法
  8. [Java] 蓝桥杯 BASIC-10 基础练习 十进制转十六进制
  9. zedboard板子上呼吸灯的实现(第一版)仿真代码的实现
  10. Android源码编译到/data/app方法
  11. be服务器未正常运行5.4.15,RHEL5.4 DNS服务器配置详解(一)
  12. C#【高级篇】 IntPtr是什么?怎么用?
  13. 私域运营如何做到高转化高复购?快鲸scrm必不可少
  14. oracle数据库技术_创建 pdb数据库
  15. Python 爬取笔趣阁小说
  16. BitTorrent Sync简介
  17. android Acitvity action,flag和category各个参数的说明 .
  18. codelite14中文语言包_codelite中文版-codelite下载(开源的C++跨平台开发环境) 13.0.7 中文版 - 河东下载站...
  19. 用python提取字符串的中英文——建议收藏反复观看
  20. 国外网络需要验证中国手机号码的格式(获取手机的验证码时)(kaggle 收不到手机验证码)

热门文章

  1. windows下nginx-http-flv-module的nginx集成环境的傻瓜式部署
  2. Android硬编、硬解h264
  3. 用云计算重构CFO的管理世界
  4. 百款蓝牙耳机试用测评:这五款高性价比蓝牙耳机更值得入手
  5. 程序员秘籍之九阴真经
  6. 计算机辅助教学在语文上应用,计算机辅助教学在语文教学过程中的运用-小学语文论文-语文论文-教师论文.docx...
  7. Centos DHCP服务的搭建
  8. 3D游戏建模需要学多久才能做出高精模型?学了能就业吗?
  9. 《徐汇区推动数字广告产业高质量发展的扶持意见》的通知
  10. XSS-14、15注入靶场闯关(小游戏)——第十四、五关