接着上文
为了了解内部的含义我们这样定义了一个实体类的父类
我们使用了 @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
- 它是 Spring Framework 或 Apache Commons 提供的工具方法
- 功能:遍历源对象(user)的所有 getter 方法,调用目标对象(vo)对应的 setter 方法,将值复制过去。
- 本质:纯 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 尽可能不用对应的实体类