我在这里陷入两难境地。因此,我有这个 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());
杨__羊羊
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()));
添加回答
举报
0/150
提交
取消