You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java Record中转换构造方法参数以替换DTO?

用Java Record替换原DTO的实现方案

直接给出等价的Record实现,完全匹配原DTO的业务逻辑:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonCreator.Mode;
import java.util.Set;
import java.util.stream.Collectors;

public record MyDTO(Set<NotificationType> enabledSettings) {

    @JsonCreator(mode = Mode.PROPERTIES)
    public MyDTO(Set<String> enabledSettings) {
        this(enabledSettings.stream()
                .map(s -> NotificationType.valueOf(s.toUpperCase()))
                .collect(Collectors.toSet()));
    }
}

核心细节说明:

  • Record的主构造定义了对外暴露的属性类型Set<NotificationType>,自动生成的enabledSettings()方法等价于原DTO的getEnabledSettings(),满足对外提供枚举集合的需求。
  • 重载的构造方法标记@JsonCreator并指定PROPERTIES模式,专门处理输入的Set<String>类型数据,内部完成字符串到枚举的转换后调用主构造初始化Record。
  • 原DTO的@NoArgsConstructor在这里无需保留——Jackson通过标记@JsonCreator的构造方法即可完成反序列化。如果业务场景强制要求无参构造,可添加以下代码:
    public MyDTO() {
        this(Set.of());
    }
    

逻辑验证:

  • 反序列化阶段,Jackson会自动匹配到接收Set<String>的构造方法,完成字符串到枚举集合的转换。
  • 对外提供的enabledSettings()方法返回Set<NotificationType>,与原DTO的Getter行为完全一致。

内容的提问来源于stack exchange,提问作者idelkaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:25:25