Как мне правильно это абстрагировать - PullRequest
2 голосов
/ 16 октября 2019

У меня возникла дилемма.

Итак, у меня есть этот Rest API, который действует как упрощающий прокси между другим API, который его использует, и SOAP API от внешнего провайдера.

В нем у меня есть 4 метода, соответствующих 4 конечным точкам Soap, которые отображают данные из DTO-запросов на отдых в DTO-запросы на мыло.

4 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 ]

1 голос
/ 16 октября 2019

Или, опираясь на предыдущий ответ, сделайте его более общим, чтобы он работал и для других объектов запроса

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());
0 голосов
/ 16 октября 2019

Вы можете начать с простого служебного метода:

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()));
...