我如何正确地抽象这个

我在这里陷入两难境地。


因此,我有这个 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 自动生成的


holdtom
浏览 140回答 2
2回答

守着星空守着你

或者在上一个答案的基础上,使其更加通用,这样它也适用于其他请求对象private <T, E> void setIfNotNull(E setterObject, BiConsumer<E, T> setter, T value) {&nbsp; &nbsp;if (value != null) {&nbsp; &nbsp; &nbsp; &nbsp;setter.accept(setterObject, value);&nbsp; &nbsp;}}有了这个你现在可以打电话setIfNotNull(sRO1, sRO1::setCommonField1, rR01.getCommonField1());

杨__羊羊

您可以从一个简单的实用方法开始:private&nbsp;static&nbsp;<T>&nbsp;void&nbsp;setIfNotNull(T&nbsp;object,&nbsp;Consumer<T>&nbsp;setter)&nbsp;{ &nbsp;&nbsp;if&nbsp;(object&nbsp;!=&nbsp;null)&nbsp;setter.accept(object); }然后你的主要代码变成:setIfNotNull(rR01.getCommonField1(),&nbsp;o&nbsp;->&nbsp;sRO1.setCommonField1(o)); setIfNotNull(rR01.getCommonField2(),&nbsp;bd&nbsp;->&nbsp;sRO1.setCommonField2(bd.intValue()));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java