【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获取参数和自定义参数类型转换器及编码过滤器

    目录   一、使用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日
    浏览(65)
  • 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日
    浏览(48)
  • spring中存储和获取bean对象

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

    2024年02月15日
    浏览(41)
  • 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日
    浏览(35)
  • 【Spring MVC】Spring MVC的功能使用和相关注解介绍

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

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

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

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

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

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

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

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

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

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

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

    2024年02月15日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包