【Spring MVC】获取 @RequsetBody 标识的对象,使用适配器模式增加代码可读性

这篇具有很好参考价值的文章主要介绍了【Spring MVC】获取 @RequsetBody 标识的对象,使用适配器模式增加代码可读性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前言

一个技术需求引发的思考和实践:

  • 思考
    • 用 AOP 把校验代码
  • 实践
    • 用 Spring MVC 的 RequestBodyAdvice 做AOP逻辑
    • 继承 RequestBodyAdviceAdapter 实现自己的 适配器
    • 用自己的适配器让代码可读性增加
    • 熟悉 Spring MVC 、Java 反射的一些实践
  • 本文内容
    • 澄清一个AOP校验JSON内容的思路
    • 复习适配器模式

【Spring MVC】获取 @RequsetBody 标识的对象,使用适配器模式增加代码可读性
【Spring MVC】获取 @RequsetBody 标识的对象,使用适配器模式增加代码可读性

2. 怎么选择切面?

  • 一个大致的切面
    【Spring MVC】获取 @RequsetBody 标识的对象,使用适配器模式增加代码可读性
  • 从 Spring 4.2 开始,有新的切面出现,可以切到 RequestBody 上,这个切面更符合技术需求的粒度。
	public interface RequestBodyAdvice 

3. RequestBody 的切面的描述

  • RequestBodyAdvice
public interface RequestBodyAdvice {
	// 什么时候切
	boolean supports(MethodParameter methodParameter, Type targetType,
			Class<? extends HttpMessageConverter<?>> converterType);

	// 切到读body前的位置
	HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter,
			Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException;

	// 切到读body后的位置
	Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
			Type targetType, Class<? extends HttpMessageConverter<?>> converterType);
	
	// 处理空body
	@Nullable
	Object handleEmptyBody(@Nullable Object body, HttpInputMessage inputMessage, MethodParameter parameter,
			Type targetType, Class<? extends HttpMessageConverter<?>> converterType);
}

根据接口描述,直接实现这个接口需要读很多参数的含义,其实实现业务需求仅需要:

  • 实现少部分方法
  • 了解少部分方法的参数

4. Spring 提供的 RequestBody 的适配器

  • RequestBodyAdviceAdapter

    该适配器简化了一个方法,并提供了必要的三个方法的实现

public abstract class RequestBodyAdviceAdapter implements RequestBodyAdvice {

	@Override
	public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter,
			Type targetType, Class<? extends HttpMessageConverter<?>> converterType)
			throws IOException {
		return inputMessage;
	}

	@Override
	public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
			Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
		return body;
	}

	@Override
	@Nullable
	public Object handleEmptyBody(@Nullable Object body, HttpInputMessage inputMessage,
			MethodParameter parameter, Type targetType,
			Class<? extends HttpMessageConverter<?>> converterType) {
		return body;
	}

}

根据适配器描述 afterBodyRead 方法能获取到 body 参数,我们能找到重点

  • afterBodyRead 方法
  • afterBodyRead 方法的 body 参数
    我们可以根据这个特点,实现自己的适配器

5. 拓展 Spring 的适配器,实现自己的适配器

public abstract class AdviceAdapter extends RequestBodyAdviceAdapter {

	// 暴露关心的参数
	abstract void validate(Object body);

	@Override
	public boolean supports(MethodParameter methodParameter, @Nullable Type targetType, @Nullable Class<? extends HttpMessageConverter<?>> converterType) {
		return Objects.nonNull(methodParameter.getMethodAnnotation(RequestValidated.class));
	}

	@Override
	@Nonnull
	public Object afterBodyRead(@Nonnull Object body, @Nullable HttpInputMessage inputMessage, MethodParameter parameter,
								@Nullable Type targetType, @Nullable Class<? extends HttpMessageConverter<?>> converterType) {
		// 嵌入切面
		validate(body);
		return input;
	}
}

6. 在自己的适配器上实现逻辑

// 注意切 RequestBody 用的注解是 ControllerAdvice
@ControllerAdvice
public class ValidateAdvice extends AdviceAdapter {

	// 具体实现
    @Override
    void validate(Object json) {
        
    }
}

7. 后记

之前整理过适配器模式的内容,现在感受更深了。
适配器可以多个配合起来工作,一个形象的图用来比喻这种设计:
【Spring MVC】获取 @RequsetBody 标识的对象,使用适配器模式增加代码可读性文章来源地址https://www.toymoban.com/news/detail-498978.html

到了这里,关于【Spring MVC】获取 @RequsetBody 标识的对象,使用适配器模式增加代码可读性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring MVC获取参数和自定义参数类型转换器及编码过滤器

    Spring MVC获取参数和自定义参数类型转换器及编码过滤器

    目录   一、使用Servlet原生对象获取参数 1.1 控制器方法 1.2 测试结果 二、自定义参数类型转换器 2.1 编写类型转换器类 2.2 注册类型转换器对象  2.3 测试结果  三、编码过滤器 3.1 JSP表单 3.2 控制器方法 3.3 配置过滤器 3.4 测试结果  往期专栏文章相关导读  1. Maven系列专

    2024年02月10日
    浏览(10)
  • Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)

    Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)

    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅 💡 1. 接收客户端(Client)请求参数【讲解完毕】2. 调用业务对象【讲解】3. 页面跳转 dispatcher.xml DAO Service Controller 现有SSM开发中存在的问题 MVC层的对象(Controller, mvc:annotation-driven/,视图解

    2024年02月05日
    浏览(13)
  • 【Spring MVC】Spring MVC的功能使用和相关注解介绍

    【Spring MVC】Spring MVC的功能使用和相关注解介绍

    Spring MVC主要有三个功能: 连接 获取参数 输出数据 对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了Spring MVC。 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。 先创建一个SpringMVC项目,过程和SpringBoot项目创建相

    2024年02月16日
    浏览(13)
  • Spring - 更简单的获取 Bean 对象

    Spring - 更简单的获取 Bean 对象

    目录 二、获取 Bean 对象(对象装配或者对象注入) 1. 属性注入 1.1 属性注入的优点和缺点: 2. Setter注入  2.1 Setter注入的优点和缺点 3. 构造方法注入(spring 官方推荐的对象注入方式) 3.1 构造方法的优点和缺点 4. @Autowired 注解 和 @Resource 注解的区别 4.1 @Autowired 和 @Source 的区

    2024年02月16日
    浏览(12)
  • spring中存储和获取bean对象

    spring中存储和获取bean对象

    存储 Bean 分为以下 2 步: 存储 Bean 之前,先得有 Bean 才⾏,因此先要创建⼀个 Bean, 说白了也就是写一个类。 告诉spring,把这个类的对象存起来。 编写 User 类, 有 sayHi 方法。 告诉 spring ,把这个类的对象存起来。 在配置文件中可以通过 bean 标签来告诉 spring 把对象存起来。

    2024年02月15日
    浏览(14)
  • Spring——更快捷的存储 / 获取Bean对象

    Spring——更快捷的存储 / 获取Bean对象

    本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下! 上篇文章中,向Spring容器中添加对象,还要去配置文件里手动添

    2024年02月15日
    浏览(16)
  • 【Spring MVC】快速学习使用Spring MVC的注解及三层架构

    【Spring MVC】快速学习使用Spring MVC的注解及三层架构

    💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring MVC】快速学习使用Spring MVC的注解及三层架构 🎉欢迎大家点赞👍评论📝收藏⭐文章 SpringWebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。它的正式名称“SpringWebMVC”来⾃其源模块的名称(Spri

    2024年04月17日
    浏览(46)
  • Spring Batch 作业对象-作业参数设置与获取

    Spring Batch 作业对象-作业参数设置与获取

    目录 引言 JobParameters 作业参数设置 作业参数获取 方案1:使用ChunkContext类   方案2:使用@Value 延时获取 转视频版 书接上篇Spring Batch批处理-作业Job简介,上篇带小伙伴们了解色作业Job对象,那这篇就看一下作业参数是啥一回事,同时要怎么设置参数并获取参数的。 前面提到

    2023年04月15日
    浏览(12)
  • Spring系列学习九、Spring MVC的使用

    Spring系列学习九、Spring MVC的使用

    本章我们将与大家一起探讨Spring框架中的Web模块中的一颗璀璨明珠——Spring MVC。在这个章节中,我们将对MVC设计模式、Spring MVC的工作原理、HandlerMapping和ViewResolver的作用,以及如何处理表单、文件上传和异常处理等内容有基本的了解。别担心,我将以通俗易懂、幽默风趣的方

    2024年02月01日
    浏览(11)
  • 【JavaEE】Spring中注解的方式去获取Bean对象

    【JavaEE】Spring中注解的方式去获取Bean对象

    【JavaEE】Spring的开发要点总结(3) 在前面的代码里,我们获取Bean对象也比较麻烦: 本文章就是为了更方便地去获取Bean对象~ 对象装配 也叫 对象注入 那么有没有对应的注解去实现这个功能呢? Spring提供的三种实现方法: 属性注入 构造方法注入 Setter注入 而这种非明文获取

    2024年02月15日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包