我在這里陷入兩難境地。因此,我有這個 Rest API,它充當使用它的另一個 API 和來自外部提供商的 SOAP API 之間的簡化代理。其中,我有 4 個方法對應于 4 個 Soap 端點,它們將數(shù)據(jù)從 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 請求對象執(zhí)行任何操作,因為它們是通過 Swagger/OpenApi 自動生成的
2 回答

守著星空守著你
TA貢獻1799條經(jīng)驗 獲得超8個贊
或者在上一個答案的基礎上,使其更加通用,這樣它也適用于其他請求對象
private <T, E> void setIfNotNull(E setterObject, BiConsumer<E, T> setter, T value) {
if (value != null) {
setter.accept(setterObject, value);
}
}
有了這個你現(xiàn)在可以打電話
setIfNotNull(sRO1, sRO1::setCommonField1, rR01.getCommonField1());

楊__羊羊
TA貢獻1943條經(jīng)驗 獲得超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()));
添加回答
舉報
0/150
提交
取消