目录
拓展配置(可选) 不影响项目启动,为了提高生产环境性能,建议您按需配置
拓展配置(可选) 不影响项目启动,为了提高生产环境性能,建议您按需配置
一.什么是Easy-Es
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.
二.为什么要使用Easy-Es
EasyEs是一个基于ElasticSearch官方提供的RestHighLevelClient开发的ORM框架,它的设计理念类似于Mybatis-Plus,旨在简化开发、提高效率。使用EasyEs的主要原因包括:
- 简化操作:EasyEs让开发者无需掌握复杂的DSL语句MySQLElasticsearch
- 提高效率:对于熟悉Mybatis-Plus
- 易于集成:EasyEs作为一款轻量级的ORM框架,对现有工程的影响小,几乎无侵入性,启动时会自动注入基本的CRUD操作,性能基本无损耗,使得开发者能够直接面向对象操作,提高了开发效率。
- 降低成本:在特定的应用场景下,如大型数据的存储和检索,EasyEs通过优化存储和索引方式,如使用ZSTD压缩功能快照备份S3存储
综上所述,使用EasyEs可以显著简化Elasticsearch的操作,提高开发效率,同时降低数据存储和检索的成本,是开发和运维人员值得考虑的选择.
三.Spring整合Easy-Es
1.添加依赖
<!-- 引入easy-es最新版本的依赖 -->
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<!-- 指定easy-es的版本号,确保使用的是最新稳定版 -->
<version>2.0.0-beta3</version>
</dependency>
<!-- 排除Spring Boot中内置的Elasticsearch依赖,避免与easy-es中的依赖发生冲突 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 根据项目需求指定Spring Boot的版本,此处未指定则默认使用最新版本 -->
<!--<version>2.7.18</version>-->
<exclusions>
<!-- 排除Elasticsearch REST高级客户端 -->
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
<!-- 排除Elasticsearch REST客户端 -->
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
</exclusion>
<!-- 排除Elasticsearch核心库 -->
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 手动引入指定版本的Elasticsearch REST高级客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.14.0</version>
</dependency>
<!-- 手动引入指定版本的Elasticsearch REST客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.14.0</version>
</dependency>
<!-- 手动引入指定版本的Elasticsearch核心库 -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.14.0</version>
</dependency>
2.添加配置
yml:
easy-es:
enable: true #默认为true,若为false则认为不启用本框架
address : 你的ip地址:9200
logging:
level:
tracer: trace # 开启trace级别日志,在开发时可以开启此配置,则控制台可以打印es全部请求信息及DSL语句,为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false.
拓展配置(可选) 不影响项目启动,为了提高生产环境性能,建议您按需配置
easy-es:
keep-alive-millis: 30000 # 心跳策略时间,单位: 毫秒 (ms)。设置保持连接活动的时间,防止因长时间无数据传输而导致的连接关闭。
connect-timeout: 5000 # 连接超时时间,单位: 毫秒 (ms)。设置建立连接的超时时间。
socket-timeout: 600000 # 通信超时时间,单位: 毫秒 (ms)。设置读取数据的超时时间,超过该时间将中断读取。
request-timeout: 5000 # 请求超时时间,单位: 毫秒 (ms)。设置发送请求的超时时间,超过该时间将认为请求失败。
connection-request-timeout: 5000 # 连接请求超时时间,单位: 毫秒 (ms)。设置从连接池中获取连接的超时时间。
max-conn-total: 100 # 最大连接数,单位: 个。设置连接池中最大允许的连接总数。
max-conn-per-route: 100 # 最大连接路由数,单位: 个。设置每个路由(即目标主机)的最大连接数。
全局配置(可选) 不影响项目启动,若省略则为默认值
easy-es:
schema: http # 默认值为http 可缺省 也支持https免ssl方式 配置此值为 https 即可
banner: true # 默认为true 打印banner 若您不期望打印banner,可配置为false
global-config:
i-kun-mode: false # 是否开启小黑子模式,默认关闭, 开启后日志将更有趣,提升编码乐趣,仅供娱乐,切勿用于其它任何用途
process-index-mode: manual #索引处理模式,smoothly:平滑模式, not_smoothly:非平滑模式, manual:手动模式,,默认开启此模式
print-dsl: true # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能
distributed: false # 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁.
reindexTimeOutHours: 72 # 重建索引超时时间 单位小时,默认72H 可根据ES中存储的数据量调整
async-process-index-blocking: true # 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快
active-release-index-max-retry: 4320 # 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数,若数据量过大,重建索引数据迁移时间超过4320/60=72H,可调大此参数值,此参数值决定最大重试次数,超出此次数后仍未成功,则终止重试并记录异常日志
active-release-index-fixed-delay: 60 # 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数 分布式环境下,平滑模式,当前客户端激活最新索引重试时间间隔 若您期望最终一致性的时效性更高,可调小此值,但会牺牲一些性能
db-config:
map-underscore-to-camel-case: false # 是否开启下划线转驼峰 默认为false
index-prefix: daily_ # 索引前缀,可用于区分环境 默认为空 用法和MP的tablePrefix一样的作用和用法
id-type: customize # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成
field-strategy: not_empty # 字段更新策略 默认为not_null
enable-track-total-hits: true # 默认开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响,若查询数量突破1W条时,需要同步调整@IndexName注解中的maxResultWindow也大于1w,并重建索引后方可在后续查询中生效(不推荐,建议分页查询).
refresh-policy: immediate # 数据刷新策略,默认为不刷新,若对数据时效性要求比较高,可以调整为immediate,但性能损耗高,也可以调整为折中的wait_until
batch-update-threshold: 10000 # 批量更新接口的阈值 默认值为1万,突破此值需要同步调整enable-track-total-hits=true,@IndexName.maxResultWindow > 1w,并重建索引.
smartAddKeywordSuffix: true # 是否智能为字段添加.keyword后缀 默认开启,开启后会根据当前字段的索引类型及当前查询类型自动推断本次查询是否需要拼接.keyword后缀
多数据源(可选):
easy-es:
dynamic:
datasource:
ds1:
address: 你的ip地址:9200 #数据源1的连接地址
#username: '若无可去掉此行'
#password: '若无可去掉此行'
ds2:
address: 你的ip地址:9200 #数据源2的连接地址
#username: '若无可去掉此行'
#password: '若无可去掉此行'
#dsn...
properties:
# Easy-ES 配置
easy-es.enable=true # 默认为true, 若为false则认为不启用本框架
easy-es.address=你的ip地址:9200
# 日志配置
logging.level.tracer=trace # 开启trace级别日志,在开发时可以开启此配置,则控制台可以打印ES全部请求信息及DSL语句,为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false.
拓展配置(可选) 不影响项目启动,为了提高生产环境性能,建议您按需配置
# Easy-ES 配置
easy-es.keep-alive-millis=30000 # 心跳策略时间,单位: 毫秒 (ms)。设置保持连接活动的时间,防止因长时间无数据传输而导致的连接关闭。
easy-es.connect-timeout=5000 # 连接超时时间,单位: 毫秒 (ms)。设置建立连接的超时时间。
easy-es.socket-timeout=600000 # 通信超时时间,单位: 毫秒 (ms)。设置读取数据的超时时间,超过该时间将中断读取。
easy-es.request-timeout=5000 # 请求超时时间,单位: 毫秒 (ms)。设置发送请求的超时时间,超过该时间将认为请求失败。
easy-es.connection-request-timeout=5000 # 连接请求超时时间,单位: 毫秒 (ms)。设置从连接池中获取连接的超时时间。
easy-es.max-conn-total=100 # 最大连接数,单位: 个。设置连接池中最大允许的连接总数。
easy-es.max-conn-per-route=100 # 最大连接路由数,单位: 个。设置每个路由(即目标主机)的最大连接数。
全局配置(可选) 不影响项目启动,若省略则为默认值
# ES连接协议,默认值为http,可缺省;也支持https免ssl方式,配置此值为 https 即可
easy.es.schema=http
# 是否打印banner,默认为true,若不期望打印banner,可配置为false
easy.es.banner=true
# 是否开启小黑子模式,默认关闭,开启后日志将更有趣,提升编码乐趣,仅供娱乐,切勿用于其它任何用途
easy.es.global-config.i-kun-mode=false
# 索引处理模式:
# smoothly: 平滑模式
# not_smoothly: 非平滑模式
# manual: 手动模式,默认开启此模式
easy.es.global-config.process-index-mode=manual
# 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能
easy.es.global-config.print-dsl=true
# 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁
easy.es.global-config.distributed=false
# 重建索引超时时间,单位小时,默认72H,可根据ES中存储的数据量调整
easy.es.global-config.reindexTimeOutHours=72
# 异步处理索引是否阻塞主线程,默认阻塞,数据量过大时调整为非阻塞异步进行,项目启动更快
easy.es.global-config.async-process-index-blocking=true
# 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数
# 若数据量过大,重建索引数据迁移时间超过4320/60=72H,可调大此参数值
# 此参数值决定最大重试次数,超出此次数后仍未成功,则终止重试并记录异常日志
easy.es.global-config.active-release-index-max-retry=4320
# 分布式环境下,平滑模式,当前客户端激活最新索引重试时间间隔
# 若您期望最终一致性的时效性更高,可调小此值,但会牺牲一些性能
easy.es.global-config.active-release-index-fixed-delay=60
# 是否开启下划线转驼峰,默认为false
easy.es.global-config.db-config.map-underscore-to-camel-case=false
# 索引前缀,可用于区分环境,默认为空,用法和MP的tablePrefix一样的作用和用法
easy.es.global-config.db-config.index-prefix=daily_
# id生成策略:
# customize: 自定义,id值由用户生成,比如取MySQL中的数据id
# 缺省此项配置,则id默认策略为ES自动生成
easy.es.global-config.db-config.id-type=customize
# 字段更新策略,默认为not_null
easy.es.global-config.db-config.field-strategy=not_empty
# 是否开启总数追踪,默认开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响
# 若查询数量突破1W条时,需要同步调整@IndexName注解中的maxResultWindow也大于1w,并重建索引后方可在后续查询中生效(不推荐,建议分页查询)
easy.es.global-config.db-config.enable-track-total-hits=true
# 数据刷新策略,默认为不刷新,若对数据时效性要求比较高,可以调整为immediate,但性能损耗高,也可以调整为折中的wait_until
easy.es.global-config.db-config.refresh-policy=immediate
# 批量更新接口的阈值,默认值为1万,突破此值需要同步调整enable-track-total-hits=true,@IndexName.maxResultWindow > 1w,并重建索引
easy.es.global-config.db-config.batch-update-threshold=10000
# 是否智能为字段添加.keyword后缀,默认开启,开启后会根据当前字段的索引类型及当前查询类型自动推断本次查询是否需要拼接.keyword后缀
easy.es.global-config.db-config.smartAddKeywordSuffix=true
多数据源(可选)
# 动态数据源配置
easy.es.dynamic.datasource.ds1.address=你的ip地址:9200 # 数据源1的连接地址
# easy.es.dynamic.datasource.ds1.username= # 若无用户名可去掉此行
# easy.es.dynamic.datasource.ds1.password= # 若无密码可去掉此行
easy.es.dynamic.datasource.ds2.address=你的ip地址:9200 # 数据源2的连接地址
# easy.es.dynamic.datasource.ds2.username= # 若无用户名可去掉此行
# easy.es.dynamic.datasource.ds2.password= # 若无密码可去掉此行
# 你可以继续添加更多的数据源,例如:
# easy.es.dynamic.datasource.ds3.address=其他地址:9200 # 数据源3的连接地址
# easy.es.dynamic.datasource.ds3.username=其他用户名 # 若无用户名可去掉此行
# easy.es.dynamic.datasource.ds3.password=其他密码 # 若无密码可去掉此行
四.代码实现
1.编写实体类
// Lombok 注解,自动为类生成 getter 和 setter 方法
@Data
// 指定 Elasticsearch 索引名及分片数
@IndexName(value = "user_es", shardsNum = 3)
public class User {
/**
* 用户ID
* 使用自定义ID类型
*/
@IndexId(type = IdType.CUSTOMIZE)
private Integer id;
/**
* 用户姓名
* 字段类型为 TEXT,使用 IK 最大词元分词器进行索引和搜索
* 在搜索结果中,匹配的部分将被高亮显示
*/
@IndexField(value = "userName", fieldType = FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD, searchAnalyzer = Analyzer.IK_MAX_WORD)
@HighLight(preTag = "<span style=\"color:red\">", postTag = "</span>")
private String name;
/**
* 用户年龄
* 字段类型为 INTEGER
*/
@IndexField(fieldType = FieldType.INTEGER)
private Integer age;
/**
* 用户工资
* 字段类型为 DOUBLE
*/
@IndexField(fieldType = FieldType.DOUBLE)
private BigDecimal salary;
/**
* 用户生日
* 字段类型为 DATE
*/
@IndexField(fieldType = FieldType.DATE)
private Date birthday;
}
注释详解:
@IndexName:
value = "user_es": 指定索引名称为 user_es。
shardsNum = 3: 设置分片数量为 3。
replicasNum = 1: 设置副本数量为 1。
@IndexId:
type = IdType.CUSTOMIZE: 指定 ID 类型为自定义。
@IndexField:
value = "userName": 指定字段在 Elasticsearch 中的名称为 userName。
fieldType = FieldType.TEXT: 指定字段类型为 TEXT。
analyzer = Analyzer.IK_MAX_WORD: 指定索引时使用的分词器为 IK_MAX_WORD。
searchAnalyzer = Analyzer.IK_MAX_WORD: 指定搜索时使用的分词器为 IK_MAX_WORD。
@HighLight:
preTag = "": 高亮部分前缀标签。
postTag = "": 高亮部分后缀标签。
2.方法及使用示例
1.基本 CRUD 操作方法
insert(T entity)
- 描述: 插入一条记录。
- 参数: T entity - 要插入的实体对象。
- 返回值: boolean - 插入是否成功。
insertBatch(List entities)
- 描述: 批量插入记录。
- 参数: List entities - 要插入的实体对象列表。
- 返回值: boolean - 插入是否成功。
deleteById(Object id)
- 描述: 根据 ID 删除记录。
- 参数: Object id - 要删除的记录的 ID。
- 返回值: boolean - 删除是否成功。
deleteBatchIds(Listids)
- 描述: 批量删除记录。
- 参数: Listids - 要删除的记录的 ID 列表。
- 返回值: boolean - 删除是否成功。
updateById(T entity)
- 描述: 根据 ID 更新记录。
- 参数: T entity - 要更新的实体对象。
- 返回值: boolean - 更新是否成功。
update(T entity, Wrapper wrapper)
- 描述: 根据条件更新记录。
- 参数:
- T entity - 要更新的实体对象。
- Wrapper wrapper - 更新条件。
- 返回值: boolean - 更新是否成功。
selectById(Object id)
- 描述: 根据 ID 查询记录。
- 参数: Object id - 要查询的记录的 ID。
- 返回值: T - 查询到的实体对象。
selectList(Wrapper queryWrapper)
- 描述: 根据条件查询记录列表。
- 参数: Wrapper queryWrapper - 查询条件。
- 返回值: List - 查询到的实体对象列表。
2. 批量操作
insertOrUpdate(T entity)
- 描述: 插入或更新记录。如果记录存在则更新,否则插入。
- 参数: T entity - 要插入或更新的实体对象。
- 返回值: boolean - 操作是否成功。
insertOrUpdateBatch(List entities)
- 描述: 批量插入或更新记录。如果记录存在则更新,否则插入。
- 参数: List entities - 要插入或更新的实体对象列表。
- 返回值: boolean - 操作是否成功。
3. 查询操作
selectOne(Wrapper queryWrapper)
- 描述: 根据条件查询单条记录。
- 参数: Wrapper queryWrapper - 查询条件。
- 返回值: T - 查询到的实体对象。
selectCount(Wrapper queryWrapper)
- 描述: 根据条件查询记录总数。
- 参数: Wrapper queryWrapper - 查询条件。
- 返回值: long - 记录总数。
selectPage(Page page, Wrapper queryWrapper)
- 描述: 分页查询记录。
- 参数:
- Page page - 分页对象。
- Wrapper queryWrapper - 查询条件。
- 返回值: IPage - 分页结果。
selectMaps(Wrapper queryWrapper)
- 描述: 根据条件查询记录列表,返回 Map 形式的列表。
- 参数: Wrapper queryWrapper - 查询条件。
- 返回值: List> - 查询到的记录列表。
selectObjs(Wrapper queryWrapper)
- 描述: 根据条件查询记录列表,返回单个字段的值列表。
- 参数: Wrapper queryWrapper - 查询条件。
- 返回值: List - 查询到的记录列表。
4. 其他方法
exists(Wrapper queryWrapper)
- 描述: 根据条件判断记录是否存在。
- 参数: Wrapper queryWrapper - 查询条件。
- 返回值: boolean - 记录是否存在。
getSource(Wrapper queryWrapper)
- 描述: 获取查询条件对应的 DSL 语句。
- 参数: Wrapper queryWrapper - 查询条件。
- 返回值: String - DSL 语句。
3.代码示例
持久层(mapper)
public interface UserESMapper extends BaseEsMapper<User> {
}
注:此接口只做ES相关操作,不做数据库操作,注意冲突
业务逻辑层(Service)
public interface UserESService {
/**
* 插入用户信息
* @param user 用户对象
* @return 操作影响的行数
*/
Integer insertUser(User user);
/**
* 根据ID查询用户信息
* @param id 用户ID
* @return 用户对象
*/
User getUserById(Integer id);
/**
* 查询满足条件的用户列表
* @param queryWrapper 查询条件封装
* @return 用户列表
*/
List<User> getUserList(LambdaEsQueryWrapper<User> queryWrapper);
/**
* 更新指定ID的用户信息
* @param user 用户对象,需包含ID
* @return 操作影响的行数
*/
Integer updateUserById(User user);
/**
* 删除指定ID的用户信息
* @param id 用户ID
* @return 操作影响的行数
*/
Integer deleteUserById(Integer id);
/**
* 分页查询用户信息
* @param queryWrapper 查询条件封装
* @return 用户列表
*/
List<User> getUserListWithPage(LambdaEsQueryWrapper<User> queryWrapper);
}
实现层(ServiceImpl)
@Service
public class UserESServiceImpl implements UserESService {
@Autowired
private UserESMapper userEsMapper;
@Override
public Integer insertUser(User user) {
// 插入用户信息到数据库
return userEsMapper.insert(user);
}
@Override
public User getUserById(Integer id) {
// 根据用户ID查询用户信息
return userEsMapper.selectById(id);
}
@Override
public List<User> getUserList(LambdaEsQueryWrapper<User> queryWrapper) {
// 查询满足条件的用户列表
return userEsMapper.selectList(queryWrapper);
}
@Override
public Integer updateUserById(User user) {
// 更新指定ID的用户信息
return userEsMapper.updateById(user);
}
@Override
public Integer deleteUserById(Integer id) {
// 删除指定ID的用户信息
return userEsMapper.deleteById(id);
}
@Override
public List<User> getUserListWithPage(LambdaEsQueryWrapper<User> queryWrapper) {
// 分页查询用户信息
return userEsMapper.selectList(queryWrapper);
}
}
表现层(Controller)
@RestController
@RequestMapping("/users")
public class UserESController {
@Autowired
private UserESService userService;
@PostMapping
public Integer insertUser(@RequestBody User user) {
// 插入用户信息
return userService.insertUser(user);
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Integer id) {
// 根据用户ID查询用户信息
return userService.getUserById(id);
}
@GetMapping
public List<User> getUserList(@RequestParam(required = false) Integer age) {
// 查询满足条件的用户列表
LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();
if (age != null) {
queryWrapper.eq(User::getAge, age); // 如果提供了年龄参数,则添加等于年龄的查询条件
}
return userService.getUserList(queryWrapper);
}
@PutMapping
public Integer updateUserById(@RequestBody User user) {
// 更新指定ID的用户信息
return userService.updateUserById(user);
}
@DeleteMapping("/{id}")
public Integer deleteUserById(@PathVariable Integer id) {
// 删除指定ID的用户信息
return userService.deleteUserById(id);
}
@GetMapping("/page")
public List<User> getUserListWithPage(@RequestParam(defaultValue = "0") int from, @RequestParam(defaultValue = "10") int size) {
// 分页查询用户信息
LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();
queryWrapper.from(from).size(size); // 设置分页起始位置和大小
return userService.getUserListWithPage(queryWrapper);
}
}
启动类
@SpringBootApplication
@EsMapperScan("你的域名.mapper")
public class EasyEsApplication {
public static void main(String[] args) {
SpringApplication.run(EasyEsApplication.class, args);
}
}
4.其他
如果发生以下报错可能是因为缺少一些jackson的相关依赖
只需加入以下依赖即可
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version> <!-- 请使用最新版本 -->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.3</version> <!-- 请使用最新版本 -->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.3</version> <!-- 请使用最新版本 -->
</dependency>
注: 会报错的原因在于Spring Boot的自动配置机制依赖于这些库来处理JSON数据的序列化和反序列化。具体来说,jackson-databind、jackson-core 和 jackson-annotations 是Jackson库的核心组件,Spring Boot使用它们来处理HTTP请求和响应中的JSON数据。以下是对每个依赖项的详细解释:
1. jackson-databind
- 作用: 提供数据绑定功能,即将JSON数据转换为Java对象(反序列化)和将Java对象转换为JSON数据(序列化)。
- 重要性: 这是Jackson库的核心部分,Spring Boot的MappingJackson2HttpMessageConverter依赖于它来处理HTTP请求和响应中的JSON数据。
2. jackson-core
- 作用: 提供底层的流式API,用于高效地读取和写入JSON数据。
- 重要性: jackson-databind依赖于jackson-core来实现其数据绑定功能。没有jackson-core,jackson-databind无法正常工作。
3. jackson-annotations
- 作用: 提供注解支持,用于控制JSON数据的序列化和反序列化行为。
- 重要性: 虽然不是必需的,但这些注解(如@JsonProperty、@JsonDeserialize等)在处理复杂的JSON数据结构时非常有用。Spring Boot的一些自动配置功能也依赖于这些注解。
为什么缺少这些依赖会报错?
1.MappingJackson2HttpMessageConverter 依赖:
Spring Boot的WebMvcAutoConfiguration会自动配置一个RequestMappingHandlerAdapter,该适配器需要MappingJackson2HttpMessageConverter来处理JSON数据。
MappingJackson2HttpMessageConverter依赖于jackson-databind来实现JSON的序列化和反序列化。
2.jackson-databind 依赖:
如果没有jackson-databind,MappingJackson2HttpMessageConverter无法实例化,从而导致RequestMappingHandlerAdapter的初始化失败。
3.jackson-core 依赖:
jackson-databind依赖于jackson-core来实现底层的JSON读写操作。如果没有jackson-core,jackson-databind也无法正常工作。
4.jackson-annotations 依赖:
虽然jackson-annotations不是必须的,但在某些情况下,Spring Boot的自动配置可能会使用这些注解来优化JSON处理。缺少这些注解可能会导致一些高级功能无法正常使用。