如何在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
相关产品推荐
相关产品推荐

