重构Rest API的CancelRequest DTO:账号类型适配问题求助
重构CancelRequest DTO的解决方案
针对账号字段需要同时支持Long和String类型的场景,下面是几种实用的重构方案:
方案一:将字段存为String(推荐,避免前导零丢失问题)
账号本质是标识符,很多场景下可能包含前导零(比如银行账号),用Long存储会丢失这类信息,所以优先用String作为底层存储,同时提供转换为Long的方法:
@Getter @Setter public class CancelRequest { // 用String存储账号,保留原始格式 private String accountNumber; // 提供转换为Long的方法,处理null和非数字情况 public Long getAccountNumberAsLong() { if (accountNumber == null || accountNumber.isBlank()) { return null; } try { return Long.parseLong(accountNumber); } catch (NumberFormatException e) { // 根据业务需求处理,比如抛异常或返回null throw new IllegalArgumentException("账号格式非法,无法转换为Long", e); } } // 兼容原来的String类型设置方法 public void setAccountNumber(String number) { this.accountNumber = number; } // 支持直接传入Long设置账号 public void setAccountNumber(Long number) { this.accountNumber = number != null ? number.toString() : null; } }
使用示例:
// 需要String类型时直接获取 someObject.setStringSome1Value(cancelRequest.getAccountNumber()); // 需要Long类型时调用转换方法 someService.processAccount(cancelRequest.getAccountNumberAsLong()); // 修复原有错误代码: someSecObject.setStringSome2Value(cancelRequest.getAccountNumber());
方案二:底层存Long,提供String转换方法
如果确定账号不会有前导零,且必须以数字形式存储,可以用Long作为底层类型,同时提供获取String的方法:
@Getter @Setter public class CancelRequest { // 用Long包装类,支持null值(避免基本类型long的默认0值问题) private Long accountNumber; // 提供获取String类型的方法 public String getAccountNumberAsString() { return accountNumber != null ? accountNumber.toString() : null; } // 兼容String类型的设置方法 public void setAccountNumber(String number) { if (number != null && !number.isBlank()) { this.accountNumber = Long.parseLong(number); } else { this.accountNumber = null; } } }
使用示例:
// 需要String类型时调用转换方法 someObject.setStringSome1Value(cancelRequest.getAccountNumberAsString()); // 需要Long类型直接获取 someService.processAccount(cancelRequest.getAccountNumber()); // 修复原有错误代码: someSecObject.setStringSome2Value(cancelRequest.getAccountNumberAsString());
方案三:维护两个字段(不推荐,易出现一致性问题)
如果必须同时保留两种类型的存储,可以维护两个字段,但要确保设置时同步更新,避免数据不一致:
@Getter @Setter public class CancelRequest { private Long accountNumberLong; private String accountNumberString; public void setAccountNumber(String number) { this.accountNumberString = number; if (number != null && !number.isBlank()) { this.accountNumberLong = Long.parseLong(number); } else { this.accountNumberLong = null; } } public void setAccountNumber(Long number) { this.accountNumberLong = number; this.accountNumberString = number != null ? number.toString() : null; } }
这种方案需要额外维护字段一致性,除非有特殊业务需求,否则不建议使用。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

