当前位置:首页|资讯

MVC Parameter Resolver

作者:坏_蛋_丹发布时间:2024-09-20

给网友解决了一个不常见的需求,在基于springboot的架构下使用yaml接收参数和响应信息,springboot的Web开发是springMVC为我们提供的,但是springMVC使用较多的是将JSON请求体和XML请求体类型参数解析为对象,对应的实现类为RequestResponseBodyMethodProcessor,MappingJackson2XmlHttpMessageConverter,并没有为我们单独提供Yaml的参数解析器和消息转换器,既然没有,我们就单独实现一个Yaml参数解析器和Yaml消息转换器。

自定义参数解析

自定义参数解析器时需要实现HandlerMethodArgumentResolver这个接口,让我们来看看这个接口都有哪些需要实现的方法以及参数

看完接口描述后,我们就来实现一个自己的Yaml参数解析器,按照下图结构创建类与注解

maven依赖如下

pom.xml



创建好了结构之后,接下来完善类的实现CustomArgumentResolver这个类的实现,代码实现如下

我们来分析一下重要的操作,nativeRequest.getInputStream()获取到请求体内容,当请求体字节数为0时直接抛出错误参数异常给调用方,try块中使用Jackson反序列化yaml为Map对象,binderFactory.createBinder为创建参数绑定对象并调用createBindercreateBinder方法三个参数分别为请求对象,参数绑定目标对象,目标对象类名。这一步只是创建了一个参数绑定对象,并没有完成参数绑定,在调用binder.bind后才完成参数绑定,这个方法需要传入一个PropertyValues接口类型的参数,这时直接new一个MutablePropertyValues对象并在构造参数里面传入之前反序列化好的Map,MutablePropertyValues的内部将字段存放在了一个Set集合中,而值则是封装在一个List集合的PropertyValue中。此时调用binder.bind(propertyValues)完成参数绑定,原始对象o内部即有属性值,然后返回这个对象即可。


自定义消息转换

Yaml参数解析是完成了,但是我们要将返回的对象也变成Yaml类型的,这怎么办呢?那我们也来自定义一个消息转换器,自定义消息转换器比较简单,我们需要继承AbstractHttpMessageConverter<T>这个抽象类,并实现里面的抽象方法,示例如下

方法分析writeInternal方法用于处理响应内容,方法第一个参数为controller返回的对象,第二个对象用于获取类型为httpservletresponse的输出流对象,我们直接用objectMapper对象写出这个输出流,即可完成响应。

注册转换器与解析器

我们需要将编写完成的消息转换器与参数解析器注册到SpringMVC中,不然是不会生效的!示例如下

controller层使用yaml注解

可以使用postman或者是其他测试软件调用接口,请求体参数类型传入yaml的即可,请求头accpet加上定好的text/yaml即可


person类随便写



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1