前言
不知各位在开发的时候有没有遇到这种情况,当前后端分离的时候,前端时常会把很简单的参数使用 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 和后端了,感觉我还是更喜欢后端,前端太折腾了 ?。