我需要在控制台中打印带有屏蔽数据的请求正文。因此,我希望将用于打印到控制台的屏蔽的请求对象与在业务中使用而无需屏蔽的请求对象分开。
因此,我将请求对象(UnderwriteRequest request)克隆到新对象(UnderwriteRequest requestMasking),然后执行屏蔽数据的方法。
但是当我将屏蔽身份证设置为 new Object 时,参考对象(UnderwriteRequest 请求)也有屏蔽。
我不想屏蔽(UnderwriteRequest 请求),因为该对象必须在业务逻辑中使用。
为什么会对参照物产生影响? 如何屏蔽数据而不影响参考对象?
谢谢你。
public @ResponseBody ResponseEntity<UnderwriteResponse> execute(@RequestBody UnderwriteRequest request) {
UnderwriteRequest requestMasking = maskingData(request);
}
public static UnderwriteRequest maskingData(UnderwriteRequest request) throws CloneNotSupportedException {
UnderwriteRequest requestMasking = (UnderwriteRequest) request.clone();
try {
if(request != null) {
if(request.getRequestBody().getPersonalData().getIdCard() != null && !request.getRequestBody().getPersonalData().getIdCard().isEmpty()) {
maskIdCard(requestMasking, request);
}
}catch (Exception e) {
log.info(e);
}
return requestMasking;
}
public static void maskIdCard(UnderwriteRequest requestMasking, UnderwriteRequest request) {
String maskChar = "X";
String maskString = StringUtils.repeat( maskChar, 9);
String idcard = request.getRequestBody().getPersonalData().getIdCard();
requestMasking.getRequestBody().getPersonalData().setIdCard(StringUtils.overlay(idcard, maskString, 0, 9));
}
@Getter
@Setter
public class UnderwriteRequest implements Cloneable{
private RequestHeader requestHeader;
private RequestBrmsBody requestBrmsBody;
private RequestBody requestBody;
private RESPONSE_STATUS status = RESPONSE_STATUS.FAILED;
private String message;
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
我使用clone()方法将对象值复制到新对象。 因为我认为当我更改新对象中的数据时,不会影响引用对象。https://www.geeksforgeeks.org/clone-method-in-java-2/
看来您使用的是SpringBoot框架。你可以看一下 BeanUtils.copyProperties();方法。该方法通过反射为第一个对象和第二个对象分配相同的属性。不会有你说的问题