为了账号安全,请及时绑定邮箱和手机立即绑定

我如何正确地抽象这个

我如何正确地抽象这个

holdtom 2023-11-01 21:53:22
我在这里陷入两难境地。因此,我有这个 Rest API,它充当使用它的另一个 API 和来自外部提供商的 SOAP API 之间的简化代理。其中,我有 4 个方法对应于 4 个 Soap 端点,它们将数据从 Rest 请求 DTO-s 映射到 Soap 请求 DTO-s。4 个 Rest 请求 DTO 有一个 CommonDto,其中包含所有请求共有的一些对象。此常见 REST 请求 DTO 的某些字段可以为空,如果是这种情况,我会进行空检查,以便我根本不会设置相应的 SOAP 请求字段,否则会使 SOAP 请求失败。这4种方法基本上是这样的:public RestResponseObject1 method1(RestRequestObject1 rRO1){   SoapRequestObject1 sRO1= new SoapRequestObject1();   Object commonField1= rR01.getCommonField1();//Object can be anything, BigDecimal, String, int,etc.   if(commonField1!=null){       sRO1.setCommonField1(commonField1);   }   BigDecimal commonField2= rR01.getCommonField2();   if(commonField2!=null){       sRO1.setCommonField2(commonField2.intValue());   }  //etc....  return Mapper.map(soapService.doSoapMethod1(sRO1);}此方法重复 4 次,使用不同的 RestRequestObjects、RestResponseObjects 和 SoapRequestObjects,但它们之间的公共字段类型不会改变。我的问题是,如何抽象空检查,以便我不对每个方法重复它们,以便我的代码更干净?请注意,我无法选择对 Soap 请求对象执行任何操作,因为它们是通过 Swagger/OpenApi 自动生成的
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

或者在上一个答案的基础上,使其更加通用,这样它也适用于其他请求对象


private <T, E> void setIfNotNull(E setterObject, BiConsumer<E, T> setter, T value) {

   if (value != null) {

       setter.accept(setterObject, value);

   }

}

有了这个你现在可以打电话


setIfNotNull(sRO1, sRO1::setCommonField1, rR01.getCommonField1());


查看完整回答
反对 回复 2023-11-01
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您可以从一个简单的实用方法开始:

private static <T> void setIfNotNull(T object, Consumer<T> setter) {
  if (object != null) setter.accept(object);
}

然后你的主要代码变成:

setIfNotNull(rR01.getCommonField1(), o -> sRO1.setCommonField1(o));
setIfNotNull(rR01.getCommonField2(), bd -> sRO1.setCommonField2(bd.intValue()));


查看完整回答
反对 回复 2023-11-01
  • 2 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信