无须定义类,Spring 快速注入 Json 参数

Otstar Lin

前言

不知各位在开发的时候有没有遇到这种情况,当前后端分离的时候,前端时常会把很简单的参数使用 JSON 格式传入,当 Spring 要获取这些参数的时候每次都需要定义一个类,在使用的时候也需要使用对象的 Getter 方法,这样极其不方便。而如果要改前端使用 FormData 的方式传输,那么又会遇到另外一个问题:前端常用的请求库是 axios,而 axios 传输的数据默认是采用 JSON 格式传输的,如果需要使用 FromData 的方式传输,那么需要再每个请求方法上增加 FormData 的 Content-Type,或者添加到默认的配置中。

那么有什么办法可以在 Spring 中使 JSON 可以像 FormData 那样方便的注入呢?

思路

在 Spring 入参 Controller 的时候会经过一系列的 HandlerMethodArgumentResolver,我们可以写一个 Resolver 实现该接口,并在 Spring 中增加这个 Resolver,那么只要符合 JSON 格式参数,那么就可以通过该 Resolver 实现注入。

实现

首先我们需要准备一些注解,用于标注是通过 JSON 格式的数据获取参数的:

首先是和 @RequestParam 一样的 @JsonParam,用于标注该参数注入的名称和是否必须注入等信息:

然后是用于标注在方法上的 @RequestJson,通过标注这个注解,我们就可以不需要使用 @JsonParam 注解来描述参数,而是使 Spring 通过参数的名称注入该参数:

还有一些工具类这里就不写了,这些工具类主要是用于一些特性的实现,比如点语法等。具体可以到 这里 查看。

接着就是用于处理 JSON 格式参数的 HandlerMethodArgumentResolver 了:

最后还需要将该 Resolver 添加到 Spring 中:

至此实现的部分就完成了,让我们看看如何使用吧。

使用

可以看到使用的方式和 @RequestParam 无太大差别。

结语

最近打算开始接着折腾 Spring 和后端了,感觉我还是更喜欢后端,前端太折腾了 ?。