Как автоматически связать bean-компонент OkHttpClient в Spring Boot?

Я хотел бы autowire экземпляр OkHttpClient в моем классе контроллера. Я создал класс OkHttpClientFactory и пометил его как Bean в его конструкторе. Я включаю это как Autowired в класс контроллера. Однако я столкнулся со следующей проблемой -

Бин -

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import okhttp3.OkHttpClient;

@Configuration

public class OkHttpClientFactory {
    @Bean
    public OkHttpClient OkHttpClientFactory() {
        return new OkHttpClient();
    }


}

Контроллер -

import java.io.IOException;

import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.sap.lmc.beans.OkHttpClientFactory;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

@RestController
@RequestMapping("/recast")
public class Test {

    @Autowired
    private OkHttpClientFactory client;

    private String url = "https://example.com/";

    @GetMapping(path = "/fetchResponse", produces = "application/json")
    public String getRecastReponse() {

        Request request = new Request.Builder().url(url).build();
        try {
            Response response = client.newCall(request).execute();
            JSONObject json = new JSONObject();
            json.put("conversation",response.body().string());
            return json.toString();
        } catch (IOException e) {
            return e.getMessage().toString();
        }   
    }

}

Выдает следующую ошибку -

java.lang.Error: Unresolved compilation problem: 
    The method newCall(Request) is undefined for the type OkHttpClientFactory

Разве экземпляр AutowiredOkHttpClientFactory не возвращает объект типа OkHttpClient. Тогда почему метод newCall() не применим к нему?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
5 711
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Измените это @Autowired private OkHttpClientFactory client; в вашем контроллере.

к

@Autowired private OkHttpClient client;

Вы хотите @autowire к OKHttpClient, а не к классу «Factory».

Ваша фабрика является классом конфигурации, потому что вы аннотировали ее аннотацией @Configuration. В ваш контроллер вставляйте не конфигурационный компонент, а компонент, настроенный внутри него. Этот компонент будет доступен в весеннем контексте и действителен для @Autowire.

Как видите, у класса OkHttpClientFactory нет метода newCall(Request). Вы должны изменить поле private OkHttpClientFactory client; в вашем контроллере на private OkHttpClient client; и позволить Spring внедрить bean-компонент по типу.

Другие вопросы по теме