广告
返回顶部
首页 > 资讯 > 精选 >怎么自定义@RequestBody注解获取JSON数据
  • 131
分享到

怎么自定义@RequestBody注解获取JSON数据

2023-07-06 00:07:24 131人浏览 安东尼
摘要

这篇文章主要介绍“怎么自定义@RequestBody注解获取JSON数据”,在日常操作中,相信很多人在怎么自定义@RequestBody注解获取jsON数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么自

这篇文章主要介绍“怎么自定义@RequestBody注解获取JSON数据”,在日常操作中,相信很多人在怎么自定义@RequestBody注解获取jsON数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么自定义@RequestBody注解获取JSON数据”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

spring mvc 的 @RequestBody 注解只能将请求体中的 JSON 数据封装成 Bean,而无法对单一字段实施管理(例如 required、name 等属性)。

自定义注解

首先思考,我们需要这个注解做什么?

  • 设置该字段的必选性(required)

  • 设置该字段在请求体 JSON 中的 key 值(name、value)

  • 设置该字段的默认值(defaultValue)

于是我们的注解类 @JsonArg 至少应该长这样:

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.PARAMETER)public @interface JsonArg {    @AliasFor("name")    String value() default "";    @AliasFor("value")    String name() default "";    boolean required() default true;    String defaultValue() default ValueConstants.DEFAULT_NONE;}

其中:

  • @Retention(RetentionPolicy.RUNTIME) 声明我们需要在运行期动态地获取它地信息

  • @Target(ElementType.PARAMETER) 声明这个注解只能作用在方法参数

是的,它和 Spring MVC 自带的 @RequestParam 注解非常像,但 @RequestParam 只能作用于 query parameters 和 fORM data。

自定义解析器

单纯的定义注解类程序是无法知道我们要它做什么的,所以我们要告诉程序在遇到这个注解时该做什么。

public class JsonArgMethodArgumentResolver extends AbstractNamedValueMethodArgumentResolver {        @Override    protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {        JsonArg ann = parameter.getParameterAnnotation(JsonArg.class);        return (ann != null ? new JsonArgNamedValueInfo(ann) : new JsonArgNamedValueInfo());    }        @Override    protected Object resolveName(String name, MethodParameter parameter, NativeWEBRequest request) throws Exception {        ContentCachingRequestWrapper contentCachingRequestWrapper = request.getNativeRequest(ContentCachingRequestWrapper.class);        String body;        assert contentCachingRequestWrapper != null;        byte[] contentAsByteArray = contentCachingRequestWrapper.getContentAsByteArray();        if (contentAsByteArray.length == 0) {            try (BufferedReader reader = contentCachingRequestWrapper.getReader()) {                body = reader.lines().collect(Collectors.joining(""));            }        } else {            body = new String(contentAsByteArray);        }        return JSONObject.parseObject(body).get(name);    }        @Override    public boolean supportsParameter(MethodParameter parameter) {        return true;    }    private static class JsonArgNamedValueInfo extends NamedValueInfo {        public JsonArgNamedValueInfo() {            super("", false, ValueConstants.DEFAULT_NONE);        }        public JsonArgNamedValueInfo(JsonArg annotation) {            super(annotation.name(), annotation.required(), annotation.defaultValue());        }    }}

注意到在 resolveName() 方法中我们获取的 request 类型是 ContentCachingRequestWrapper。

这是因为默认的 request 只能读取一次请求体,而我们的解析器在解析每个方法参数时都需要读取一次请求体。

包装请求

添加过滤器将我们的请求转换为所需要的 ContentCachingRequestWrapper。

@Componentpublic class CachingRequestBodyFilter extends GenericFilterBean {    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        if (servletRequest instanceof httpservletRequest) {            filterChain.doFilter(new ContentCachingRequestWrapper((HttpServletRequest) servletRequest), servletResponse);        } else {            filterChain.doFilter(servletRequest, servletResponse);        }    }}

注册解析器

最后,将自定义的解析器注册到 Spring MVC。

@Configurationpublic class springMVCConfig implements WebMvcConfigurer {    @Override    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {        resolvers.add(new JsonArgMethodArgumentResolver());    }}

用法

和 @RequestParam 的用法相似。

public CommonResult<Object> signUp(            @JsonArg(name = "uname") String username,            @JsonArg(required = false, name = "pwd", defaultValue = "123") String passWord    ) {        log.info("[Username]: {}, [Password]: {}", username, password);        return null;}

到此,关于“怎么自定义@RequestBody注解获取JSON数据”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么自定义@RequestBody注解获取JSON数据

本文链接: https://www.lsjlt.com/news/356580.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么自定义@RequestBody注解获取JSON数据
    这篇文章主要介绍“怎么自定义@RequestBody注解获取JSON数据”,在日常操作中,相信很多人在怎么自定义@RequestBody注解获取JSON数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么自...
    99+
    2023-07-06
  • 自定义@RequestBody注解如何获取JSON数据
    目录自定义注解自定义解析器包装请求注册解析器用法总结Spring MVC 的 @RequestBody 注解只能将请求体中的 JSON 数据封装成 Bean,而无法对单一字段实施管理...
    99+
    2023-05-15
    自定义@RequestBody注解 @RequestBody注解 @RequestBody注解获取JSON数据
  • 怎么用Spring的spel获取自定义注解参数值
    这篇文章主要介绍了怎么用Spring的spel获取自定义注解参数值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Spring的spel获取自定义注解参数值文章都会有所收获,下面我们一起来看看吧。spel获...
    99+
    2023-06-29
  • Spring spel获取自定义注解参数值方式
    目录spel获取自定义注解参数值1.注解类2.注解使用3.aop中处理 spel在注解中的使用1 语法说明2. 基本用法4 #{…}和${…}s...
    99+
    2022-11-13
  • PHP中json数据怎么获取
    在PHP中,可以使用`json_decode()`函数将JSON数据转换为PHP对象或数组。以下是使用json_decode()函数...
    99+
    2023-09-25
    PHP json
  • Java怎么自定义注解
    这篇文章主要介绍“Java怎么自定义注解”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么自定义注解”文章能帮助大家解决问题。注解注解为我们在代码中添加信息提供一种形式化的方法,使我们可以在...
    99+
    2023-07-05
  • 怎么用自定义注解
    本篇内容介绍了“怎么用自定义注解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本知识在Java中,注解分为两种,元注解和自定义注解。很多人...
    99+
    2023-06-16
  • ajax怎么获取json数据并显示
    要使用Ajax获取JSON数据并显示,可以按照以下步骤进行操作:1. 创建一个XMLHttpRequest对象:```var xhr...
    99+
    2023-09-12
    json ajax
  • java中怎么自定义注解详解
    在Java中,可以使用`@interface`关键字来定义注解。自定义注解的语法如下: public @interface Cust...
    99+
    2023-10-28
    java
  • 怎么在java中自定义注解
    这篇文章给大家介绍怎么在java中自定义注解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。1、@Val...
    99+
    2023-06-07
  • Java注解怎么自定义使用
    这篇文章主要介绍了Java注解怎么自定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java注解怎么自定义使用文章都会有所收获,下面我们一起来看看吧。注解注解基本介绍注解概述:Java 注解(Annota...
    99+
    2023-07-05
  • Java怎么实现自定义注解
    本文小编为大家详细介绍“Java怎么实现自定义注解”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么实现自定义注解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概念概念:说明程序的。给计算机看的注释:用...
    99+
    2023-07-02
  • java怎么自定义注解做参数校验
    在Java中,可以使用自定义注解来进行参数校验。以下是一个简单的示例: import java.lang.annotation.El...
    99+
    2023-10-26
    java
  • AJAX跨域请求怎么获取JSON数据
    这篇文章主要介绍“AJAX跨域请求怎么获取JSON数据”,在日常操作中,相信很多人在AJAX跨域请求怎么获取JSON数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”AJAX...
    99+
    2022-10-19
  • 自定义过滤器获取不到session问题怎么解决
    今天给大家介绍一下自定义过滤器获取不到session问题怎么解决。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。自定义过滤器获取不到session根本原因,多个...
    99+
    2023-06-26
  • json怎么根据字符串获取整条数据
    使用`json.loads()`函数将字符串解析为json对象,然后可以通过键值对的方式获取整条数据。以下是一个示例:```pyth...
    99+
    2023-10-10
    json
  • Feign怎么自定义注解翻译器
    本篇内容主要讲解“Feign怎么自定义注解翻译器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Feign怎么自定义注解翻译器”吧!Feign自定义注解翻译器新建自定义注解MyUrlpackage...
    99+
    2023-06-29
  • AJAX跨域请求JSONP怎么获取JSON数据
    这篇文章将为大家详细讲解有关AJAX跨域请求JSONP怎么获取JSON数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Asynchronous JavaScript a...
    99+
    2022-10-19
  • 使用json怎么获取数据库的信息
    使用json怎么获取数据库的信息?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。ajax发送请求到controller,controller响应一个json格式的数据给页面,...
    99+
    2023-06-08
  • 使用request怎么获取body中的json数据
    使用request怎么获取body中的json数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在request中可以获取到来自Http请求的body数据比如获取json格...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作