controller
/**
* 根据用户名查询用户信息
*/
@GetMapping("/api/short-link/admin/v1/user/{username}")
public Result<UserRespDTO> getUserByUsername(@PathVariable("username") String username) {
return Results.success(userService.getUserByUsername(username));
}
service
@Override
public UserRespDTO getUserByUsername(String username) {
LambdaQueryWrapper<UserDO> queryWrapper = Wrappers.lambdaQuery(UserDO.class)
.eq(UserDO::getUsername, username);
UserDO userDO = baseMapper.selectOne(queryWrapper); //拿到我的用户
if (userDO == null) {
throw new ServiceException(UserErrorCodeEnum.USER_NULL);
}
UserRespDTO result = new UserRespDTO();
BeanUtils.copyProperties(userDO, result); //将user用户内的部分信息拷贝到UserRespDTO中
return result;
}
UserRespDTO
@Data
public class UserRespDTO {
/**
* id
*/
private Long id;
/**
* 用户名
*/
private String username;
/**
* 真实姓名
*/
private String realName;
/**
* 手机号
*/
@JsonSerialize(using = PhoneDesensitizationSerializer.class)
private String phone;
/**
* 邮箱
*/
private String mail;
}
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); //将脱敏后的数据重新写入到json字符串中
}
}
1:当系统需要返回一个 UserRespDTO
对象作为响应数据时,Jackson 会负责将这个对象序列化为 JSON 字符串。
2:在序列化过程中,Jackson 发现 phone
字段上有 @JsonSerialize
注解,指定要使用 PhoneDesensitizationSerializer
类来序列化这个字段
3:PhoneDesensitizationSerializer
的 serialize
方法被调用,传入的原始手机号会通过 DesensitizedUtil.mobilePhone(phone)
方法被脱敏处理。
4:最后,处理过的(即脱敏后的)手机号会被写入到生成的 JSON 字符串中。