diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/service/CancellationTransactionService.java b/aconnect/src/main/java/com/mfsys/aconnect/client/service/CancellationTransactionService.java index 464e92b..4990978 100644 --- a/aconnect/src/main/java/com/mfsys/aconnect/client/service/CancellationTransactionService.java +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/service/CancellationTransactionService.java @@ -2,12 +2,10 @@ package com.mfsys.aconnect.client.service; import com.mfsys.aconnect.client.dto.DepositCancellationDTO; import com.mfsys.aconnect.client.dto.GLCancellationDTO; +import com.mfsys.aconnect.configuration.config.WebClientConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import java.util.Map; import static com.mfsys.common.configuration.constant.AconnectURI.ACONNECT; import static com.mfsys.common.configuration.constant.AconnectURI.GENERALLEDGER; @@ -21,12 +19,12 @@ public class CancellationTransactionService { @Value("${app.generalledger.uri}") private String generalledgerURI; - private final RestTemplate restTemplate; - public CancellationTransactionService(RestTemplate restTemplate) { - this.restTemplate = restTemplate; + private final WebClientConfig webClientConfig; + public CancellationTransactionService(WebClientConfig webClientConfig) { + this.webClientConfig = webClientConfig; } - public Object processDepositCancellationTransaction(DepositCancellationDTO depositCancellationDTO, String tokenHeader) { + public ResponseEntity processDepositCancellationTransaction(DepositCancellationDTO depositCancellationDTO, String tokenHeader) { String porOrgacode = depositCancellationDTO.getPorOrgacode(); String url = depositURI + "/deposit" + "/organizations/" + depositCancellationDTO.getPorOrgacode() + "/transactions" + ACONNECT + "/cancel/nodes/" + depositCancellationDTO.getNodeId() + @@ -37,20 +35,16 @@ public class CancellationTransactionService { headers.set("POR_ORGACODE", porOrgacode); headers.set("SUS_USERCODE", depositCancellationDTO.getSusUsercode()); headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); - HttpEntity entity = new HttpEntity<>(depositCancellationDTO, headers); - - ResponseEntity response = restTemplate.exchange( + return webClientConfig.post( url, - HttpMethod.POST, - entity, - Map.class + depositCancellationDTO, + headers ); - - return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } - public Object processGLCancellationTransaction(GLCancellationDTO glCancellationDTO, String tokenHeader) { + public ResponseEntity processGLCancellationTransaction(GLCancellationDTO glCancellationDTO, String tokenHeader) { String porOrgacode = glCancellationDTO.getPorOrgacode(); String url = generalledgerURI + GENERALLEDGER + "/organizations/" + glCancellationDTO.getPorOrgacode() + "/transactions" + ACONNECT + "/cancel/nodes/" + glCancellationDTO.getNodeId() + @@ -61,16 +55,13 @@ public class CancellationTransactionService { headers.set("POR_ORGACODE", porOrgacode); headers.set("SUS_USERCODE", glCancellationDTO.getSusUsercode()); headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); - HttpEntity entity = new HttpEntity<>(glCancellationDTO, headers); - ResponseEntity response = restTemplate.exchange( + return webClientConfig.post( url, - HttpMethod.POST, - entity, - Map.class + glCancellationDTO, + headers ); - - return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } } diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/service/RejectTransactionService.java b/aconnect/src/main/java/com/mfsys/aconnect/client/service/RejectTransactionService.java index 2200c5f..a18c71c 100644 --- a/aconnect/src/main/java/com/mfsys/aconnect/client/service/RejectTransactionService.java +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/service/RejectTransactionService.java @@ -4,9 +4,7 @@ import com.mfsys.aconnect.client.dto.DepositRejectDTO; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import java.util.Map; +import com.mfsys.aconnect.configuration.config.WebClientConfig; import static com.mfsys.common.configuration.constant.AconnectURI.ACONNECT; @@ -19,12 +17,12 @@ public class RejectTransactionService { @Value("${app.generalledger.uri}") private String generalledgerURI; - private final RestTemplate restTemplate; - public RejectTransactionService(RestTemplate restTemplate) { - this.restTemplate = restTemplate; + private final WebClientConfig webClientConfig; + public RejectTransactionService(WebClientConfig webClientConfig) { + this.webClientConfig = webClientConfig; } - public Object processDepositRejectionTransaction(DepositRejectDTO rejectRequest, String tokenHeader) { + public ResponseEntity processDepositRejectionTransaction(DepositRejectDTO rejectRequest, String tokenHeader) { String porOrgacode = rejectRequest.getPorOrgacode(); String url = depositURI + "/deposit/" + "/organizations/" + porOrgacode + "/transactions" + ACONNECT +"/rejection"; HttpHeaders headers = new HttpHeaders(); @@ -33,19 +31,14 @@ public class RejectTransactionService { headers.set("SUS_USERCODE", rejectRequest.getSusUsercode()); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity entity = new HttpEntity<>(rejectRequest, headers); - - ResponseEntity response = restTemplate.exchange( + return webClientConfig.post( url, - HttpMethod.POST, - entity, - Map.class + rejectRequest, + headers ); - - return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } - public Object processGLRejectionTransaction(DepositRejectDTO rejectRequest, String tokenHeader) { + public ResponseEntity processGLRejectionTransaction(DepositRejectDTO rejectRequest, String tokenHeader) { String porOrgacode = rejectRequest.getPorOrgacode(); String url = generalledgerURI + "/generalledger/" + "/organizations/" + porOrgacode + "/transactions" + ACONNECT +"/rejection"; HttpHeaders headers = new HttpHeaders(); @@ -54,16 +47,11 @@ public class RejectTransactionService { headers.set("SUS_USERCODE", rejectRequest.getSusUsercode()); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity entity = new HttpEntity<>(rejectRequest, headers); - - ResponseEntity response = restTemplate.exchange( + return webClientConfig.post( url, - HttpMethod.POST, - entity, - Map.class + rejectRequest, + headers ); - - return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } } diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/service/ReversalTransactionService.java b/aconnect/src/main/java/com/mfsys/aconnect/client/service/ReversalTransactionService.java index 06d9cdf..b4fc070 100644 --- a/aconnect/src/main/java/com/mfsys/aconnect/client/service/ReversalTransactionService.java +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/service/ReversalTransactionService.java @@ -5,9 +5,7 @@ import com.mfsys.aconnect.client.dto.GLReversalDTO; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import java.util.Map; +import com.mfsys.aconnect.configuration.config.WebClientConfig; import static com.mfsys.common.configuration.constant.AconnectURI.ACONNECT; @@ -20,15 +18,17 @@ public class ReversalTransactionService { @Value("${app.generalledger.uri}") private String generalledgerURI; - private final RestTemplate restTemplate; - public ReversalTransactionService(RestTemplate restTemplate) { - this.restTemplate = restTemplate; + private final WebClientConfig webClientConfig; + public ReversalTransactionService(WebClientConfig webClientConfig) { + this.webClientConfig = webClientConfig; } - public Object processDepositReversalTransaction(DepositReversalDTO reversalRequest, String tokenHeader) { + public ResponseEntity processDepositReversalTransaction(DepositReversalDTO reversalRequest, String tokenHeader) { + String porOrgacode = reversalRequest.getPorOrgacode(); String nodeID = reversalRequest.getNodeId(); String sgtGntrtranlink = reversalRequest.getSgtGntrtranlink(); + String url = depositURI + "/deposit/" + "/organizations/" + porOrgacode + "/transactions" + ACONNECT + "/reversals/nodes/" + nodeID + "/trannums/" + sgtGntrtranlink; HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", tokenHeader); @@ -36,19 +36,15 @@ public class ReversalTransactionService { headers.set("SUS_USERCODE", reversalRequest.getSusUsercode()); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity entity = new HttpEntity<>(reversalRequest, headers); - - ResponseEntity response = restTemplate.exchange( + return webClientConfig.post( url, - HttpMethod.POST, - entity, - Map.class + reversalRequest, + headers ); - - return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } - public Object processGLReversalTransaction(GLReversalDTO reversalRequest, String tokenHeader) { + public ResponseEntity processGLReversalTransaction(GLReversalDTO reversalRequest, String tokenHeader) { + String porOrgacode = reversalRequest.getPorOrgacode(); String nodeID = reversalRequest.getNodeId(); String sgtGntrtranlink = reversalRequest.getSgtGntrtranlink(); @@ -60,16 +56,11 @@ public class ReversalTransactionService { headers.set("SUS_USERCODE", reversalRequest.getSusUsercode()); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity entity = new HttpEntity<>(reversalRequest, headers); - - ResponseEntity response = restTemplate.exchange( + return webClientConfig.post( url, - HttpMethod.POST, - entity, - Map.class + reversalRequest, + headers ); - - return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } } diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionAuthorizationService.java b/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionAuthorizationService.java index cfe3c63..a47d8c9 100644 --- a/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionAuthorizationService.java +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionAuthorizationService.java @@ -2,12 +2,10 @@ package com.mfsys.aconnect.client.service; import com.mfsys.aconnect.client.dto.DepositAuthorizationRequest; import com.mfsys.aconnect.client.dto.GLAuthorizationDTO; +import com.mfsys.aconnect.configuration.config.WebClientConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import java.util.Map; import static com.mfsys.common.configuration.constant.AconnectURI.ACONNECT; @@ -20,12 +18,11 @@ public class TransactionAuthorizationService { @Value("${app.generalledger.uri}") private String generalledgerURI; - private final RestTemplate restTemplate; - public TransactionAuthorizationService(RestTemplate restTemplate) { - this.restTemplate = restTemplate; - } + private final WebClientConfig webClientConfig; + public TransactionAuthorizationService(WebClientConfig webClientConfig) { + this.webClientConfig = webClientConfig;} - public Object processDepositAuthTransaction(DepositAuthorizationRequest authorizationRequest, String tokenHeader) { + public ResponseEntity processDepositAuthTransaction(DepositAuthorizationRequest authorizationRequest, String tokenHeader) { String porOrgacode = authorizationRequest.getPorOrgacode(); String url = depositURI + "/deposit/" + "/organizations/" + porOrgacode + "/transactions" + ACONNECT + "/authorizations"; HttpHeaders headers = new HttpHeaders(); @@ -35,19 +32,14 @@ public class TransactionAuthorizationService { headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); - HttpEntity entity = new HttpEntity<>(authorizationRequest, headers); - - ResponseEntity response = restTemplate.exchange( + return webClientConfig.post( url, - HttpMethod.POST, - entity, - Map.class + authorizationRequest, + headers ); - - return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } - public Object processGLAuthTransaction(GLAuthorizationDTO authorizationRequest, String tokenHeader) { + public ResponseEntity processGLAuthTransaction(GLAuthorizationDTO authorizationRequest, String tokenHeader) { String porOrgacode = authorizationRequest.getPorOrgacode(); String url = generalledgerURI + "/generalledger/" + "/organizations/" + porOrgacode + "/transactions/authorizations"; HttpHeaders headers = new HttpHeaders(); @@ -56,16 +48,11 @@ public class TransactionAuthorizationService { headers.set("SUS_USERCODE", authorizationRequest.getSusUsercode()); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity entity = new HttpEntity<>(authorizationRequest, headers); - - ResponseEntity response = restTemplate.exchange( + return webClientConfig.post( url, - HttpMethod.POST, - entity, - Map.class + authorizationRequest, + headers ); - - return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } } diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionLogService.java b/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionLogService.java index 43d9b84..936c66d 100644 --- a/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionLogService.java +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionLogService.java @@ -46,14 +46,15 @@ public class TransactionLogService { } @Transactional - public void updateResponseFields(Long logId, Map response) { - transactionLogRepository.findById(logId).ifPresent(log -> { - if (response == null) return; - Object argsObj = response.get("arguments"); - if (!(argsObj instanceof List args) || args.isEmpty()) return; + public void updateResponseFields(Long logId, Object responseObj) { + if (!(responseObj instanceof Map response)) return; + + Object argsObj = response.get("arguments"); + if (!(argsObj instanceof List args) || args.isEmpty()) return; - String transactionId = args.get(0).toString(); + String transactionId = args.get(0).toString(); + transactionLogRepository.findById(logId).ifPresent(log -> { log.setTransactionID(transactionId); }); } diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionService.java b/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionService.java index 2ce12f5..2c80df6 100644 --- a/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionService.java +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/service/TransactionService.java @@ -3,13 +3,11 @@ package com.mfsys.aconnect.client.service; import com.mfsys.aconnect.client.dto.*; import com.mfsys.aconnect.client.exception.*; import com.mfsys.aconnect.client.model.TransactionLog; +import com.mfsys.aconnect.configuration.config.WebClientConfig; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; import org.springframework.http.HttpHeaders; @@ -29,10 +27,10 @@ public class TransactionService { @Value("${app.generalledger.uri}") private String generalledgerURI; - private final RestTemplate restTemplate; + private final WebClientConfig webClientService; private final TransactionLogService transactionLogService; - public TransactionService(RestTemplate restTemplate, TransactionLogService transactionLogService) { - this.restTemplate = restTemplate; + public TransactionService(WebClientConfig webClientService, TransactionLogService transactionLogService) { + this.webClientService = webClientService; this.transactionLogService = transactionLogService; } @@ -49,8 +47,7 @@ public class TransactionService { headers.set("SUS_USERCODE", userCode); headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); - HttpEntity entity = new HttpEntity<>(headers); - ResponseEntity response = restTemplate.exchange(url,HttpMethod.GET,entity,Map.class); + ResponseEntity response = webClientService.get(url, headers); return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); } @@ -81,15 +78,12 @@ public class TransactionService { headers.set("SUS_USERCODE", accountGLTransactionRequest.getSgtGntrcreateusr()); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); - HttpEntity entity = new HttpEntity<>(accountGLTransactionRequest, headers); TransactionLog log = transactionLogService.createTransactionLog(accountGLTransactionRequest, url); - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = restTemplate.exchange( + ResponseEntity response = webClientService.post( url, - HttpMethod.POST, - entity, - Map.class + accountGLTransactionRequest, + headers ); if (response.getBody() != null) { transactionLogService.updateResponseFields(log.getLogId(), response.getBody()); @@ -136,15 +130,12 @@ public class TransactionService { headers.set("SUS_USERCODE", gLtoGLRequest.getSgtGntrcreateusr()); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); - HttpEntity entity = new HttpEntity<>(gLtoGLRequest, headers); - RestTemplate restTemplate = new RestTemplate(); TransactionLog log = transactionLogService.createGLtoGLTransactionLog(gLtoGLRequest, url); - ResponseEntity response = restTemplate.exchange( + ResponseEntity response = webClientService.post( url, - HttpMethod.POST, - entity, - Map.class + gLtoGLRequest, + headers ); if (response.getBody() != null) { transactionLogService.updateResponseFields(log.getLogId(), response.getBody()); @@ -189,15 +180,12 @@ public class TransactionService { headers.set("SUS_USERCODE", accountToAccountDTO.getSgtGntrcreateusr()); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); - HttpEntity entity = new HttpEntity<>(accountToAccountDTO, headers); - RestTemplate restTemplate = new RestTemplate(); TransactionLog log = transactionLogService.createAccToAccTransactionLog(accountToAccountDTO, url); - ResponseEntity response = restTemplate.exchange( + ResponseEntity response = webClientService.post( url, - HttpMethod.POST, - entity, - Map.class + accountToAccountDTO, + headers ); if (response.getBody() != null) { transactionLogService.updateResponseFields(log.getLogId(), response.getBody()); @@ -229,16 +217,13 @@ public class TransactionService { headers.set("SUS_USERCODE", glToAccountDTO.getSgtGntrcreateusr()); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); - HttpEntity entity = new HttpEntity<>(glToAccountDTO, headers); - RestTemplate restTemplate = new RestTemplate(); TransactionLog log = transactionLogService.createGLToAccTransactionLog(glToAccountDTO, url); - ResponseEntity response = restTemplate.exchange( + ResponseEntity response = webClientService.post( url, - HttpMethod.POST, - entity, - Map.class + glToAccountDTO, + headers ); if (response.getBody() != null) { transactionLogService.updateResponseFields(log.getLogId(), response.getBody()); diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/service/UploadDocumentService.java b/aconnect/src/main/java/com/mfsys/aconnect/client/service/UploadDocumentService.java index 791072b..7c1cb3f 100644 --- a/aconnect/src/main/java/com/mfsys/aconnect/client/service/UploadDocumentService.java +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/service/UploadDocumentService.java @@ -1,11 +1,11 @@ package com.mfsys.aconnect.client.service; +import com.mfsys.aconnect.configuration.config.WebClientConfig; import org.springframework.util.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -19,10 +19,9 @@ public class UploadDocumentService { @Value("${app.crm.uri}") private String crmURI; - private final RestTemplate restTemplate; - - public UploadDocumentService(RestTemplate restTemplate){ - this.restTemplate = restTemplate; + private final WebClientConfig webClientConfig; + public UploadDocumentService(WebClientConfig webClientConfig){ + this.webClientConfig = webClientConfig; } public ResponseEntity> depositCacheFiles( @@ -44,12 +43,10 @@ public class UploadDocumentService { body.add("file", file.getResource()); } - HttpEntity> requestEntity = new HttpEntity<>(body, headers); - - return restTemplate.exchange( + return webClientConfig.postMultipart( url, - HttpMethod.POST, - requestEntity, + body, + headers, new ParameterizedTypeReference>() {} ); } @@ -73,12 +70,10 @@ public class UploadDocumentService { body.add("file", file.getResource()); } - HttpEntity> requestEntity = new HttpEntity<>(body, headers); - - return restTemplate.exchange( + return webClientConfig.postMultipart( url, - HttpMethod.POST, - requestEntity, + body, + headers, new ParameterizedTypeReference>() {} ); } diff --git a/aconnect/src/main/java/com/mfsys/aconnect/configuration/config/WebClientConfig.java b/aconnect/src/main/java/com/mfsys/aconnect/configuration/config/WebClientConfig.java index fe15892..d7ea9bc 100644 --- a/aconnect/src/main/java/com/mfsys/aconnect/configuration/config/WebClientConfig.java +++ b/aconnect/src/main/java/com/mfsys/aconnect/configuration/config/WebClientConfig.java @@ -1,23 +1,123 @@ package com.mfsys.aconnect.configuration.config; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.MultiValueMap; +import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; - -@Configuration +@Service public class WebClientConfig { - private final String baseUrl = "http://localhost:8080/digitalkisaan"; + private final WebClient webClient = WebClient.builder().build(); + + public ResponseEntity post(String url, Object body, HttpHeaders headers) { + try { + return webClient + .post() + .uri(url) + .headers(h -> h.addAll(headers)) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .bodyValue(body) + .retrieve() + .toEntity(Object.class) + .block(); + } catch (WebClientResponseException ex){ + return buildErrorResponse(ex); + } + } + + public ResponseEntity postMultipart(String url, MultiValueMap body, HttpHeaders headers, ParameterizedTypeReference responseType) { + try { + return webClient + .post() + .uri(url) + .headers(h -> h.addAll(headers)) + .contentType(MediaType.MULTIPART_FORM_DATA) + .body(BodyInserters.fromMultipartData(body)) + .retrieve() + .toEntity(responseType) + .block(); + } catch (WebClientResponseException ex) { + return buildErrorResponseTyped(ex); + } + } + + public ResponseEntity get(String url, HttpHeaders headers) { + try { + return webClient + .get() + .uri(url) + .headers(h -> h.addAll(headers)) + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .toEntity(Object.class) + .block(); + } catch (WebClientResponseException ex){ + return buildErrorResponse(ex); + } + } + + public ResponseEntity put(String url, Object body, HttpHeaders headers) { + try { + return webClient + .put() + .uri(url) + .headers(h -> h.addAll(headers)) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .bodyValue(body) + .retrieve() + .toEntity(Object.class) + .block(); + } catch (WebClientResponseException ex){ + return buildErrorResponse(ex); + } + } + + public ResponseEntity delete(String url, HttpHeaders headers) { + try { + return webClient + .delete() + .uri(url) + .headers(h -> h.addAll(headers)) + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .toEntity(Object.class) + .block(); + } catch (WebClientResponseException ex) { + return buildErrorResponse(ex); + } + } + + private ResponseEntity buildErrorResponse(WebClientResponseException ex){ + Object errorBody; + try{ + errorBody = ex.getResponseBodyAs(Object.class); + }catch (Exception e) { + errorBody = ex.getResponseBodyAsString(); + } + return ResponseEntity + .status(ex.getStatusCode()) + .contentType(MediaType.APPLICATION_JSON) + .body(errorBody); + } - @Bean - public WebClient webClient(WebClient.Builder builder) { - return builder - .baseUrl(baseUrl) // Set the base URL for all requests - .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) // Set a default content type - .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) // Set a default accept header - .build(); - } + private ResponseEntity buildErrorResponseTyped(WebClientResponseException ex) { + T errorBody; + try { + errorBody = (T) ex.getResponseBodyAs(Object.class); + } catch (Exception e) { + errorBody = (T) ex.getResponseBodyAsString(); + } + return ResponseEntity + .status(ex.getStatusCode()) + .contentType(MediaType.APPLICATION_JSON) + .body(errorBody); + } }