ErKang

Java后端

作用

用于将一个 Java Bean(对象)的属性复制到另一个 Java Bean 中

使用场景

⭐属性复制:BeanUtil.copyProperties可以将一个对象中的属性值复制到另一个对象中,类似于Spring的BeanUtils和Apache Commons的BeanUtils。
⭐忽略空值:Hutool的BeanUtil提供了可以忽略空值属性的复制选项,这样就不会覆盖目标对象中的非空属性。
⭐支持不同类型的对象:源对象和目标对象可以是不同的类,只要它们有相同的属性名和兼容的类型。
⭐支持嵌套属性复制:如果属性本身也是一个Java Bean,BeanUtil.copyProperties可以递归地复制这些嵌套的属性。
阅读全文 »

Lombok依赖

@RequiredArgsConstructor注解

private final Xxx xxx;

用户表设计

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(256) DEFAULT NULL COMMENT '用户名',
`password` varchar(512) DEFAULT NULL COMMENT '密码',
`real_name` varchar(256) DEFAULT NULL COMMENT '真实姓名',
`phone` varchar(128) DEFAULT NULL COMMENT '手机号',
`mail` varchar(512) DEFAULT NULL COMMENT '邮箱',
`deletion_time` bigint(20) DEFAULT NULL COMMENT '注销时间戳',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`del_flag` tinyint(1) DEFAULT NULL COMMENT '删除标识 0:未删除 1:已删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
阅读全文 »

是什么

Hutool的BeanUtil.toBean方法用于将一个Map对象转换为一个指定类型的Java对象(Bean)。它会根据Map中的键值对,将对应的值赋给Java对象中的属性。
BeanUtil.toBean

主要功能

类型转换:BeanUtil.toBean会尝试进行基本的类型转换。例如,如果Map中的值是String类型,而Bean中的属性是Integer类型,它会尝试将String转换为Integer。
属性映射:Map中的键与Bean中的属性名进行匹配,将对应的值赋值给Bean的属性。

使用场景

将请求参数转换为对象:在Web开发中,通常会从前端接收到一个包含多个参数的Map,通过toBean可以直接将这些参数转换为一个Java对象,方便后续操作。
动态生成对象:在某些动态场景下,数据可能以Map的形式存储,但业务逻辑需要操作Java对象,此时可以使用toBean方法将Map转换为对应的Java对象。

在代码中使用

1
BeanUtil.toBean(userService.getUserByUsername(username), UserActualRespDTO.class)

使用场景

对用户的敏感信息(比如身份证、电话号码等)做隐藏化返回处理

手机号序列化器

1️⃣在src/main/java/.../common/serialize路径下新建手机号序列化器类
⭐用到的是Hutool工具包里的DesensitizedUtil工具类的mobilePhone方法来实现手机号的脱敏展示
⤵️Hutool脱敏工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cn.hutool.core.util.DesensitizedUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
* 手机号脱敏反序列化
*/
public class PhoneDesensitizationSerializer extends JsonSerializer<String> {

@Override
public void serialize(String phone, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String phoneDesensitization = DesensitizedUtil.mobilePhone(phone);
jsonGenerator.writeString(phoneDesensitization);
}
}

2️⃣在对应的DTO对象字段上面加上@JsonSerialize注解
这里以src/main/java/…/dto/resp路径下的UserRespDTO为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
* 用户返回参数响应
*/
@Data
public class UserRespDTO {

/**
* id
*/
private Long id;

/**
* 用户名
*/
private String username;

/**
* 真实姓名
*/
private String realName;

/**
* 手机号
*/
@JsonSerialize(using = PhoneDesensitizationSerializer.class)
private String phone;

/**
* 邮箱
*/
private String mail;

/**
* 注销时间戳
*/
private Long deletionTime;

/**
* 创建时间
*/
private Date createTime;

/**
* 修改时间
*/
private Date updateTime;

/**
* 删除标识 0:未删除 1:已删除
*/
private Integer delFlag;
}

新需求:必须展示无脱敏的信息
解决思路:新建一个无脱敏展示的接口
具体做法:复制一份相同的脱敏接口和返回的DTO对象,将DTO对象相应字段的@JsonSerialize注解删掉即可
Hutool还提供了BeanUtil.toBean 方法,用于map转bean

是什么?

一种约定俗成的规约,比如项目中规定你返回什么东西的时候需要用Result返回

使用场景

为请求响应信息新增code、success字段,方便判断当前请求是否正常返回
阅读全文 »

使用场景

异常兜底方案,及时捕获发生的异常并作出相应的处理,避免将问题抛到服务端然后造成服务出问题的情况

异常体系

阅读全文 »
0%