Вы можете использовать Spring AOP для решения этой сквозной проблемы.
Если предположить, что ExternalApiCallService
- это управляемый компонентом Spring, следующий код будет перехватывать все callExternalApi1()
и может регистрировать то же самое в базе данных.
@Component
@Aspect
public class ExternalCallLoggerAspect {
@Autowired
ApiCallRepository apiCallRepository;
@Pointcut("execution(* *..ExternalApiCallService.callExternalApi1(..))")
public void externalApiCallService(){}
@Around("externalApiCallService() && args(request)")
public ExternalApiCallReponseObj logCalls(ProceedingJoinPoint pjp,ExternalApiCallRequestObj request){
Object result=null;
String status = "COMPLETED";
ExternalApiCallReponseObj response = null;
// Build the apiCall from request
ApiCall apiCall = ApiCall.builder()
.clientId(clientId)
.status("SUBMITTED")
.requestPayload(request)
.build();
//save the same to db
apiCall = apiCallRepository.save(apiCall);
// Proceed to call the external Api and get the result
try {
result = pjp.proceed();
} catch (Throwable e) {
status = "FAILED";
}
//Update the response
apiCall = apiCallRepository.findById(apiCall.getId());
apiCall.setStatus(status);
apiCallRepository.save(apiCall);
if(result != null) {
response = (ExternalApiCallReponseObj)result;
apiCall.setResponsePayload(response);
}
//continue with response
return response;
}
}
Примечание
1.В опечатке с именем ExternalApiCallReponseObj
2. Проверяется, что код аспекта работает и логика c включена позже непроверенный. Пожалуйста, внесите необходимые исправления
В идеале оригинальный метод должен быть сокращен до этого
public ResponseDTOFromExternalApi externalApiCallServiceMethod(String clientId, RequestDTO requestDTO) {
return toDTO(externalApiCallService.callExternalApi1(prepareExternalApiRequestObjFromRequestDTO(requestDTO)));
}
Подробнее о Spring AOP здесь
Обновление: , если подумать, если все внешние вызовы API выполняются через один метод, скажем, ExternalApiCallService.callExternalApi1()
, эти логи логирования c можно переместить в эту общую точку, не так ли?