Clay 的技术空间

用进废退 | 艺不压身

@RequestBody 注解抛出异常

问题描述:使用 @RequestBody 注解时,抛出异常信息 “Required request body is missing”

采用 SSM 框架,前端将参数传递给后端,SpringMVC 可以通过注解 @RequestBody 将传递参数绑定在 Controller 的方法参数中。此时必须注意,当请求方法声明为 GET 和 DELETE 的时候,HTTP 请求规范里规定是不会有 RequestBody 的,只有请求方法声明为 POST 和 PUT 的时候才有,因此 @RequestBody 不适用于 GET 与 DELETE 方法。还有如果请求方法声明为 GET、DELETE,那么 SpringMVC 可以直接将传递参数绑定在方法的参数中,如果请求方法声明为 POST、PUT,则必须使用注解 @RequestBody 修饰 Controller 中的方法参数,否则无法获取前端传递过来的参数值。正确的使用方法如下:

阅读全文 »

前言

特别注意

RabbitMQ 的数据库名称规则是 NODENAME@hostname,由于 Docker 每次从 Docker Image 启动容器的时候会自动生成 hostname,这样一来之前保存在主机上的数据库就会没用了,包括之前创建的用户也会没有了。所以在创建容器的时候必须指定 hostname,比如 --hostname=my-rabbit,这样 Docker 环境启动后 RabbitMQ 就会一直读取固定目录中的数据。

阅读全文 »

前言

本文适用于 CentOS/Debian/Ubuntu 等 Linux 发行版系统。

JDK 安装

由于 Gradle 的运行依赖于 JDK,但是安装 Oracle JDK 不是必需的,如果不想安装可以使用 Open-JDK 替代,而且大多数 Linux 发行版自带 Open-JDK。

阅读全文 »

RPC 框架的核心

  • RPC 的核心模块: 通讯、序列化
  • 主流的 RPC 框架: Dubbo、gRPC、Thrift、HSF、Motan、ZBUS

RPC 的基本调用原理

rpc-principle-1

阅读全文 »

大纲

MyBatis 实用场景

MyBatis 批量操作

调用不带参数的 openSession() 方法时,创建的 SqlSession 对象具有如下特性:

  • 会开启一个事务(不会自动提交)
  • 数据库连接对象会从由环境配置的数据源实例得到
  • 事务隔离级别将会使用驱动或数据源的默认配置
  • 预处理语句不会被复用,也不会批量处理更新

值得一提的是,openSession() 方法的 ExecutorType 类型的参数是枚举类型,取值如下:

  • SIMPLE:这个执行器类型不做特殊的事情(默认执行器),它会为每个 SQL 语句的执行创建一个新的预处理语句。
  • REUSE:这个执行器类型会复用预处理语句。
  • BATCH:这个执行器会批量执行所有更新语句。
阅读全文 »

基于 ZooKeeper 实现分布式锁

  • 由于下面使用了 Curator 客户端,因此需要引入相应的依赖
1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.5.0</version>
</dependency>

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.5.0</version>
</dependency>
阅读全文 »

大纲

MyBatis 四大对象

四大对象介绍

MyBatis 的四大对象包括:Executor、StatementHandler、ParameterHandler、ResultSetHandler。四大对象的工作职责如下:

  • Executor(执行器):负责整个 SQL 执行过程的总体控制
  • StatementHandler(语句处理器):负责和 JDBC 层交互,包括预编译 SQL 语句和执行 SQL 语句,以及调用 ParameterHandler 设置参数
  • ParameterHandler(参数处理器):负责设置预编译参数
  • ResultSetHandler(结果集处理器):负责将 JDBC 查询结果映射到 JavaBean 对象
阅读全文 »

大纲

缓存机制

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。MyBatis 中默认定义了两级缓存:

  • 一级缓存和二级缓存
    • 默认情况下,只有一级缓存(SqlSession 级别的缓存,也称为本地缓存)开启
    • 二级缓存需要手动开启和配置,它是基于 namespace 级别的缓存
    • 为了提高扩展性,MyBatis 定义了缓存接口 Cache,可以通过实现 Cache 接口来自定义二级缓存
阅读全文 »