SpringBoot如果接受json参数的话需要定义实体类然后使用@RequestBody注解,但是如果每个接口都创建一个实体类的话太麻烦,因此可以使用自定义注解的方法接收。从网上发现了这篇博客,解决了一个大大的疑惑。。转载: 大佬的博客

  1. RequestJson
package com.school.service.config;import java.lang.annotation.*;@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestJson {/*** 值*/String value() default "";/*** 是否必须*/boolean require() default false;
}
  1. RequestJsonHandlerMethodArgumentResolver
package com.school.service.config;import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.rmi.ServerException;@Slf4j
public class RequestJsonHandlerMethodArgumentResolver  implements HandlerMethodArgumentResolver {/*** key*/private static final String JSON_BODY_KEY = "JSON_BODY_KEY";@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(RequestJson.class);}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {// 获取jsonNodeJsonNode jsonNode = getJsonBody(webRequest);RequestJson requestSingleParam = parameter.getParameterAnnotation(RequestJson.class);// 名String value = determineParamName(parameter, requestSingleParam);// 结果JsonNode paramValue = jsonNode.get(value);// 是否必须boolean require = requestSingleParam.require();if (paramValue == null && require) {throw new ServerException("parameter[" + value + "]不能为空。");}if (paramValue == null) {return null;}Class<?> parameterType = parameter.getParameterType();Constructor<?> constructor = parameterType.getConstructor(String.class);Object param = null;try {param = constructor.newInstance(paramValue.asText());} catch (Exception e) {log.error("bind method parameters error", e);throw new ServerException("parameter[" + value + "] format error for input value[" + paramValue.toString() + "]");}return param;}private String determineParamName(MethodParameter parameter, RequestJson requestSingleParam) {String value = requestSingleParam.value();if (value == null  || value.isEmpty()) {value = parameter.getParameterName();}return value;}private JsonNode getJsonBody(NativeWebRequest webRequest) throws JsonProcessingException {// 有就直接获取String jsonBody = (String) webRequest.getAttribute(JSON_BODY_KEY, NativeWebRequest.SCOPE_REQUEST);// 没有就从请求中读取if (jsonBody == null) {try {HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);jsonBody = IOUtils.toString(servletRequest.getReader());webRequest.setAttribute(JSON_BODY_KEY, jsonBody, NativeWebRequest.SCOPE_REQUEST);} catch (IOException e) {throw new RuntimeException(e);}}return new ObjectMapper().readTree(jsonBody);}
}
  1. 配置config
package com.school.service.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.io.File;
import java.util.List;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(new RequestJsonHandlerMethodArgumentResolver());WebMvcConfigurer.super.addArgumentResolvers(resolvers);}
}
  1. 使用
public Result register(@RequestJson String userCode, @RequestJson String nickName, @RequestJson String password) {

成功

SpringBoot自定义注解接收json参数相关推荐

  1. @RequestBody接收Json参数 | 用自定义注解对Vo对象中Date类型日期格式校验

    标题太长有木有?主要是为了把问题描述清楚,免得进错文章. 问题描述 昨天测试的同事测试接口的时候,测试出来一个Date类型校验问题. 要求输入的日期格式是:yyyy-MM-dd HH:mm:ss,Vo ...

  2. lombok 的bug?lombok 导致 springmvc 使用 @RequestBody注解 接收 json数据 对象参数绑定失败

    大家好,我是烤鸭:     lombok 导致 springmvc 使用 @RequestBody注解 接收 json数据 对象参数绑定失败.     环境版本:         spring 5.x ...

  3. @retention注解作用_分分钟带你玩转SpringBoot自定义注解

    在工作中,我们有时候需要将一些公共的功能封装,比如操作日志的存储,防重复提交等等.这些功能有些接口会用到,为了便于其他接口和方法的使用,做成自定义注解,侵入性更低一点.别人用的话直接注解就好.下面就来 ...

  4. 元旦加班写SpringBoot自定义注解

    写在前面 这个点我们公司的人走的已经差不多了,原因很简单呀,明天元旦嘛,放假前可是不加班的,很nice,实习生的我,今天给大家分享一篇springboot自定义注解的技术文章. 很牛逼的注解 开发过程 ...

  5. java自定义注解实现前后台参数校验

    其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 ...

  6. Springboot自定义注解实现用户登录状态校验(一)

    Springboot自定义注解实现用户登录状态校验(一) 拦截器方式 定义注解类 import java.lang.annotation.*;/*** @author:小飞猪* @date:2020/ ...

  7. springboot 自定义注解拦截器

    springboot 自定义注解拦截器 最近在工作中,发现自定义注解拦截使用起来特别方便,现在来写出来给大家看看 环境springboot 首先写一个自定义注解 package com.study.c ...

  8. Java接收json参数

    Java接收json参数 import java.util.List; import java.util.Map; import org.springframework.web.bind.annota ...

  9. java 自定义注解 生成json_SpringBoot:自定义注解实现后台接收Json参数

    0.需求 在实际的开发过程中,服务间调用一般使用Json传参的模式,SpringBoot项目无法使用@RequestParam接收Json传参 只有@RequestBody支持Json,但是每次为了一 ...

最新文章

  1. Linux环境网络库
  2. Python遍历字典删除元素
  3. JAVA -Xms -Xmx -XX:PermSize -XX:MaxPermSize 区别
  4. Spring Boot 返回XML
  5. python解题_python实现用户答题功能
  6. 百度搜索引擎优化指南_百度SEO优化和其他搜索引擎优化用什么不同的地方
  7. android一些不常用的事件
  8. 关于渐变属 gradient:
  9. rocketmq4.x快速入门指南
  10. 网络_简单实现远程唤醒与远程控制(Teamviewer)
  11. oracle backup exec,通过Backup Exec实施Oracle灾难恢复
  12. 游戏 Npk文件解压
  13. N1刷Android TV,贫民种草指北 篇二:N1盒子:不谈刷机,只谈使用!
  14. Pycharm问题:this applicatation failed to start because it could not find or laod the qt plaform plugin
  15. ARM裸机-13.LCD
  16. ANDROID 实现微信通讯录界面
  17. OpenCV 图片去水印(不需要自己做水印模板)
  18. XHR-XMLHttpRequest
  19. wdcp3.2版本建站流程
  20. android简单时间选择器TiemPicker

热门文章

  1. 在虚拟机里安装centos 6.4和centos 5.8里配置vim 7.4安装过程
  2. markdown的基础语言
  3. BG2EE 术士solo
  4. Shell脚本学习-阶段十-Bash脚本实现每次登录Shell时可以查看Linux系统信息
  5. 汉文博士 0.5.7.2356 版发布
  6. python 线程池的研究及实现
  7. jQuery技术内幕:深入解析jQuery架构设计与实现原理1
  8. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)
  9. canvas 边界模糊_Canvas绘制线条模糊的解决方案
  10. python list突破上限武器_Python3 tkinter基础 Listbox height 显示行数的上限