Не удается разрешить исключение NullPointerException в WebClient Builder | Весенний ботинок - PullRequest
1 голос
/ 31 марта 2020

Я получаю исключение Nullpointer при вызове сервиса с помощью WebClient.

Сервис

@Service
public class DummyWebclient  {

  @Autowired
  private WebClient getWebClient;

  public DummyWebclient() {}

  Response client3 = getWebClient.get().
            uri(uriBuilder -> uriBuilder
                .queryParam("param1", "value1")
                .queryParam("param2", "value2")
                .build() )
            .retrieve()
            .bodyToMono(Response.class)
            .block();

  public Response getClient3() {
        return client3;
    }
}

Шаблон Webservice

@Component
public class GetWebClient {

    @Bean
    public WebClient GetWebclient() {
       return WebClient
               .builder()
               .baseUrl(MainURL.getMAINURL())
               .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
               .build()
                ;
    }
}

И простой тест для получения ответа выдается исключение NullPointer, вызванное: java .lang.NullPointerException at (DummyWebclient. java: 19)

Строка Response client3 = getWebClient.get().

@ExtendWith(SpringExtension.class)
@SpringBootTest
class DummyWebclientTest{

    @Autowired
    private DummyWebclient dummyWebclient;

    @Test
    public void GetResponse2() {
        Response response2 = dummyWebclient.getClient3();
        System.out.println(response2);
    }

}

У меня вопрос: почему Spring не создает Bean и не вставляет в Service?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Добро пожаловать в Stackoverflow

класс GetWebClient должен иметь @Configuration аннотацию вместо @Component

0 голосов
/ 31 марта 2020

Вы ошиблись порядком инициализации:

@Service
public class DummyWebclient  {

  @Autowired
  private WebClient getWebClient;

  public DummyWebclient() {}

  Response client3 = getWebClient.get().
            uri(uriBuilder -> uriBuilder
                .queryParam("param1", "value1")
                .queryParam("param2", "value2")
                .build() )
            .retrieve()
            .bodyToMono(Response.class)
            .block();

  public Response getClient3() {
        return client3;
    }
}

С вашим текущим кодом:

  • создан новый экземпляр DummyWebClient
  • все поля инициализированы к их значениям по умолчанию
    • getWebClient в null
    • попытка инициализации client3: BOOM
  • только после этого Spring попытается вставить поля

У вас есть 2 варианта, чтобы это исправить:

Option1

Использовать инжекцию конструктора:

    private WebClient getWebClient;

    @Autowired
    public DummyWebClient(WebClient getWebClient) {
        this.getWebClient = getWebClient;
    }

В любом случае, это хорошая идея

Опция 2

Вы делаете блокирующий HTTP-вызов при инициализации поля. Почему бы не получить ответ по требованию, в getClient3() вызов?

ИМХО, вы должны применить оба изменения.

...