我如何正确地抽象这个
How do I abstract this correctly
我在这里进退两难
所以,我有这个 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,但公共字段类型在它们之间没有变化。
我的问题是,我怎样才能抽象出 nullchecks,这样我就不会为每个方法重复它们,从而使我的代码更清晰?请注意,我无法选择对 Soap 请求对象执行任何操作,因为它们是通过 Swagger/OpenApi
自动生成的
您可以从一个简单的实用方法开始:
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()));
或者在以前的答案的基础上,使其更通用,以便它也适用于其他请求对象
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());
我在这里进退两难
所以,我有这个 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,但公共字段类型在它们之间没有变化。
我的问题是,我怎样才能抽象出 nullchecks,这样我就不会为每个方法重复它们,从而使我的代码更清晰?请注意,我无法选择对 Soap 请求对象执行任何操作,因为它们是通过 Swagger/OpenApi
自动生成的您可以从一个简单的实用方法开始:
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()));
或者在以前的答案的基础上,使其更通用,以便它也适用于其他请求对象
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());