Я хотел бы 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() не применим к нему?




Измените это @Autowired private OkHttpClientFactory client; в вашем контроллере.
к
@Autowired private OkHttpClient client;
Вы хотите @autowire к OKHttpClient, а не к классу «Factory».
Ваша фабрика является классом конфигурации, потому что вы аннотировали ее аннотацией @Configuration. В ваш контроллер вставляйте не конфигурационный компонент, а компонент, настроенный внутри него. Этот компонент будет доступен в весеннем контексте и действителен для @Autowire.
Как видите, у класса OkHttpClientFactory нет метода newCall(Request).
Вы должны изменить поле private OkHttpClientFactory client; в вашем контроллере на private OkHttpClient client; и позволить Spring внедрить bean-компонент по типу.