diff --git a/anyame-kodik-search-api/pom.xml b/anyame-kodik-search-api/pom.xml index c680ea0..5058b31 100644 --- a/anyame-kodik-search-api/pom.xml +++ b/anyame-kodik-search-api/pom.xml @@ -28,113 +28,8 @@ - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 1.6.3 - 2.17.1 - 2.17.1 - 4.0.0 - 2.11.0 - 2.1.1 - 3.0.2 - 1.0.1 - 5.10.3 - 1.3.2 - 3.1.1 - 3.0.2 - - - - io.swagger - swagger-annotations - ${swagger-annotations-version} - - - - com.google.code.findbugs - jsr305 - ${jsr305.version} - - - com.squareup.retrofit2 - retrofit - ${retrofit-version} - - - com.squareup.retrofit2 - converter-scalars - ${retrofit-version} - - - org.apache.oltu.oauth2 - org.apache.oltu.oauth2.client - ${oltu-version} - - - org.apache.oltu.oauth2 - common - - - - - - com.squareup.retrofit2 - converter-jackson - ${retrofit-version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson-version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson-version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-databind-version} - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${jackson-version} - - - jakarta.ws.rs - jakarta.ws.rs-api - ${jakarta.ws.rs-api-version} - - - jakarta.annotation - jakarta.annotation-api - ${jakarta-annotation-version} - provided - - - javax.annotation - javax.annotation-api - ${javax-annotation-api.version} - - - - jakarta.validation - jakarta.validation-api - ${jakarta-validation-api.version} - - - - org.junit.jupiter - junit-jupiter-api - ${junit-version} - test - - + + @@ -151,12 +46,11 @@ ${project.basedir}/src/main/resources/openapi.json java - retrofit2 + restclient com.backend.search.kodik.api com.backend.search.kodik.model false true - jackson diff --git a/main-app/pom.xml b/main-app/pom.xml index 05f77b1..e332aa5 100644 --- a/main-app/pom.xml +++ b/main-app/pom.xml @@ -9,6 +9,7 @@ 3.5.5 + com.backend.vue.bff.service anyame-vue-bff 0.0.1-SNAPSHOT @@ -37,22 +38,6 @@ 8.1 - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-cache - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j @@ -61,7 +46,6 @@ org.springframework.cloud spring-cloud-starter-netflix-eureka-server - com.squareup.retrofit2 converter-jackson @@ -87,7 +71,6 @@ logstash-logback-encoder ${logstash-logback-encoder.version} - org.springframework.boot spring-boot-starter-test diff --git a/main-app/src/main/java/com/backend/vue/bff/service/config/GlobalExceptionHandler.java b/main-app/src/main/java/com/backend/vue/bff/service/config/GlobalExceptionHandler.java index bd1abdf..7e7d195 100644 --- a/main-app/src/main/java/com/backend/vue/bff/service/config/GlobalExceptionHandler.java +++ b/main-app/src/main/java/com/backend/vue/bff/service/config/GlobalExceptionHandler.java @@ -33,6 +33,7 @@ public class GlobalExceptionHandler { "API_CALL_FAILED", "Failed to communicate with external service: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value()); + logger.error("API call failed", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error); } diff --git a/main-app/src/main/java/com/backend/vue/bff/service/config/SearchApiClientConfiguration.java b/main-app/src/main/java/com/backend/vue/bff/service/config/SearchApiClientConfiguration.java index dd075a6..bf4c19b 100644 --- a/main-app/src/main/java/com/backend/vue/bff/service/config/SearchApiClientConfiguration.java +++ b/main-app/src/main/java/com/backend/vue/bff/service/config/SearchApiClientConfiguration.java @@ -1,66 +1,34 @@ package com.backend.vue.bff.service.config; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; +import org.springframework.web.client.RestClient; import com.backend.search.kodik.ApiClient; -import com.backend.search.kodik.JSON; import com.backend.search.kodik.api.SearchControllerApi; -import com.backend.vue.bff.service.factory.AbstractApiFactory; -import com.fasterxml.jackson.databind.ObjectMapper; - -import retrofit2.Retrofit.Builder; @Configuration @EnableDiscoveryClient public class SearchApiClientConfiguration { - private final DiscoveryClient discoveryClient; - - public SearchApiClientConfiguration(DiscoveryClient discoveryClient) { - this.discoveryClient = discoveryClient; + @LoadBalanced + @Bean + public RestClient.Builder restClientBuilder() { + return RestClient.builder(); } @Bean - @Lazy - public FactoryBean apiClientFactory() { - return new ApiClientFactoryBean(discoveryClient); + public ApiClient apiClient() { + return new ApiClient(restClientBuilder().build()); } @Bean @Lazy public SearchControllerApi searchApi(ApiClient apiClient) { - return apiClient.createService(SearchControllerApi.class); - } - - private static class ApiClientFactoryBean extends AbstractApiFactory { - public ApiClientFactoryBean(DiscoveryClient discoveryClient) { - super(discoveryClient, "ANYAME-KODIK-SEARCH-BACKEND"); - } - - @Override - public Class getObjectType() { - return ApiClient.class; - } - - @Override - public ObjectMapper createObjectMapper() { - JSON json = new JSON(); - return json.getMapper(); - } - - @Override - public ApiClient createApiClient() { - return new ApiClient(); - } - - @Override - protected void updateAdapterBuilder(ApiClient instance, Builder adapterBuilder) { - instance.setAdapterBuilder(adapterBuilder); - } + apiClient = apiClient.setBasePath("http://ANYAME-KODIK-SEARCH-BACKEND"); + return new SearchControllerApi(apiClient); } } diff --git a/main-app/src/main/java/com/backend/vue/bff/service/controller/TestController.java b/main-app/src/main/java/com/backend/vue/bff/service/controller/TestController.java index 5fbb3ee..1dc929e 100644 --- a/main-app/src/main/java/com/backend/vue/bff/service/controller/TestController.java +++ b/main-app/src/main/java/com/backend/vue/bff/service/controller/TestController.java @@ -4,8 +4,8 @@ import java.io.IOException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RestController; import com.backend.vue.bff.service.service.KodikService; @RestController diff --git a/main-app/src/main/java/com/backend/vue/bff/service/factory/AbstractApiFactory.java b/main-app/src/main/java/com/backend/vue/bff/service/factory/AbstractApiFactory.java deleted file mode 100644 index 1b6d817..0000000 --- a/main-app/src/main/java/com/backend/vue/bff/service/factory/AbstractApiFactory.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.backend.vue.bff.service.factory; - -import java.util.List; - -import org.springframework.beans.factory.FactoryBean; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; - -import com.backend.vue.bff.service.exception.ServiceUnavailableException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import retrofit2.Retrofit; -import retrofit2.converter.jackson.JacksonConverterFactory; -import retrofit2.converter.scalars.ScalarsConverterFactory; - -public abstract class AbstractApiFactory implements FactoryBean { - private final DiscoveryClient discoveryClient; - private final String serviceId; - - public AbstractApiFactory(DiscoveryClient discoveryClient, String serviceId) { - this.discoveryClient = discoveryClient; - this.serviceId = serviceId; - } - - @Override - public T getObject() throws Exception { - T client = createApiClient(); - - String baseUrl = resolveServiceUrl(serviceId); - - Retrofit.Builder adapterBuilder = new Retrofit.Builder() - .baseUrl(baseUrl) - .addConverterFactory(ScalarsConverterFactory.create()) - .addConverterFactory(JacksonConverterFactory.create(createObjectMapper())); - - updateAdapterBuilder(client, adapterBuilder); - - return client; - } - - @Override - public boolean isSingleton() { - return true; - } - - private String resolveServiceUrl(String serviceName) { - List instances = discoveryClient.getInstances(serviceName); - - if (instances.isEmpty()) { - throw new ServiceUnavailableException(); - } - - ServiceInstance instance = instances.get(0); - String baseUrl = instance.getUri().toString(); - - if (!baseUrl.endsWith("/")) { - baseUrl = baseUrl + "/"; - } - - return baseUrl; - } - - public abstract ObjectMapper createObjectMapper(); - - public abstract T createApiClient(); - - protected abstract void updateAdapterBuilder(T instance, Retrofit.Builder adapterBuilder); -} diff --git a/main-app/src/main/java/com/backend/vue/bff/service/service/KodikService.java b/main-app/src/main/java/com/backend/vue/bff/service/service/KodikService.java index 9337983..81d5a73 100644 --- a/main-app/src/main/java/com/backend/vue/bff/service/service/KodikService.java +++ b/main-app/src/main/java/com/backend/vue/bff/service/service/KodikService.java @@ -20,6 +20,6 @@ public class KodikService { @Cacheable("kodikSearch") public KodikResponse search(String title) throws BeansException, IOException { - return controllerApiFactory.getObject().search(title).execute().body(); + return controllerApiFactory.getObject().search(title); } } diff --git a/pom.xml b/pom.xml index 409e230..bdd3139 100644 --- a/pom.xml +++ b/pom.xml @@ -4,6 +4,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.5 + + + com.backend.vue.bff.service anyame-bff-parent 0.0.1-SNAPSHOT @@ -27,6 +34,26 @@ 21 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-cache + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + anyame-kodik-search-api main-app