BeanUtils.copyProperties 和序列化的问题

接着上文

为了了解内部的含义我们这样定义了一个实体类的父类

我们使用了 @JsonProperty(access = JsonProperty.Access.READ_ONLY)

目的是当我们用这个实体类作为传参时, 不会给对应字段赋值

而这个实体类作为返回值,我们可以看到对应的这个字段

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseEntity implements Serializable {
    // 显示声明与劣化版本UID ,确保兼容性
    private static final long serialVersionUID = 1L;
    /** 创建者-- */
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private long createBy;

    @Transient
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String createByName;


    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime createTime;

    /** 更新者 */
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private long updateBy;

    @Transient
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String updateByName;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime updateTime;

    private String status;

    @Transient
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String statusName;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private int isDelete;

    @Transient
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String isDeleteName;


    // 状态码值变为中文
    @Transient
    public String getStatusName() {
        if ("1".equals(this.status)) {
            return "启用";
        } else if ("0".equals(this.status)) {
            return "停用";
        }
        return "";
    }
}

我们的目的是这个作为实体类的父类 ,且 作为一个视图vo类(虽然大大的不推荐)

但我们也从这次踩坑学习了一些基本的语法

BeanUtils.copyProperties

  1. 它是 Spring Framework 或 Apache Commons 提供的工具方法
  2. 功能:遍历源对象(user)的所有 getter 方法,调用目标对象(vo)对应的 setter 方法,将值复制过去。
  3. 本质:纯 Java 对象操作,不涉及 JSON、XML、网络传输、字节流等

但要注意:getter/setter 被调用 ≠ 序列化

java 复制代码
@RestController
public class UserController {
    @GetMapping("/user")
    public UserVO getUser() {
        User user = ...;
        UserVO vo = new UserVO();
        BeanUtils.copyProperties(user, vo); // ← 这里不序列化

        return vo; // ← Spring MVC 会用 Jackson 把 vo 序列化成 JSON!
    }
}
问题 答案
BeanUtils.copyProperties 会序列化吗? ❌ 不会
它会调用 getter/setter 吗? ✅ 会(这是它的核心机制)
它会影响 JSON 输出吗? ⚠️ 间接影响:它决定了 vo 对象的值,而 vo 会被后续序列化
需要担心性能吗? ⚠️ 反射有开销,高频场景建议用 MapStruct

但是

每个返回都应该定义自己的Vo 尽可能不用对应的实体类

相关推荐
阿pin3 分钟前
Android随笔-View绘制流程
android·开发语言·view
Java面试题总结11 分钟前
GatewayWorker 从零到一完整指南
java
脉动数据行情23 分钟前
Java OkHttp 完整封装 GC COMEX 美黄金实时盘口定时拉取工具类
java·okhttp·comex 黄金·外盘贵金属
敖行客 Allthinker28 分钟前
IM 融合专题:后端架构师的核心修炼
java·开发语言·数据库
进击的程序猿~33 分钟前
Go Slice源码深度解析指南
开发语言·后端·golang
Hesionberger36 分钟前
快速求解完全平方数的最少数量
开发语言·数据结构·python·算法·leetcode·c#
HAPPY酷38 分钟前
【ROS2】16G 内存笔记本跑 ROS2 仿真?VMware 虚拟机“保姆级”配置指南 (R9 7940HX + RTX 4060)
java·linux·ide·windows·pycharm
折哥的程序人生 · 物流技术专研9 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
researcher-Jiang10 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
西门吹-禅11 小时前
java springboot N+1问题
java·开发语言·spring boot