Мне нужно вызвать микросервис из пакета, запущенного из другого микросервиса, используя spring-batch и openfeign - PullRequest
0 голосов
/ 10 апреля 2020

Не знаю, возможно ли это, но это мой вопрос: у меня есть партия, разработанная с использованием подпружиненной загрузки и подпружинной партии, и мне нужно вызвать другую микросервисную службу с помощью Feign ... ... help!

это мой класс Reader

package it.batch.step;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.beans.factory.annotation.Autowired;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import it.client.feign.EmailAccountClient;
import it.dto.feign.mail.account.AccountOutDto;
import it.dto.feign.mail.account.SearchAccountFilterDto;
import it.dto.feign.mail.account.SearchAccountResponseDto;

public class Reader implements ItemReader <String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(Reader.class);

    private int count = 0;

    @Autowired
    private EmailAccountClient emailAccountClient;

    @Override
    public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {

        LOGGER.info("read - begin ");
        SearchAccountResponseDto clientResponse = emailAccountClient.searchAccount(getFilter());
        if (count < clientResponse.getAccounts().size()) {
            return convertToJsonString(clientResponse.getAccounts().get(count++));
        } else {
            count = 0;
        }
        return null;
    }

    private static SearchAccountFilterDto getFilter() {
        SearchAccountFilterDto filter = new SearchAccountFilterDto();

        return filter;
    }

    private String convertToJsonString(AccountOutDto account) {
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = "";
        try {
            jsonString = mapper.writeValueAsString(account);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        LOGGER.info("Contenuto JSON: " + jsonString);
        return jsonString;
    }
}

... при запуске пакета у меня появляется эта ошибка:

java.lang.NullPointerException: null
    at it.batch.step.Reader.read(Reader.java:32) ~[classes/:?]

где строка 32:

SearchAccountResponseDto clientResponse = emailAccountClient.searchAccount(getFilter());

EmailAccountClient равен нулю

1 Ответ

0 голосов
/ 24 апреля 2020

Ваш клиент имеет значение null: ваш читатель не является @Component, поэтому Spring не может выполнить автоматическое подключение клиента. При создании экземпляра средства чтения вы должны использовать обходной путь, такой как прохождение клиента с автоматической связью через конструктор, например:

 private EmailAccountClient client;

 public reader(EmailAccountClient client){

  this.client=client;
  }

в другом классе:

  @Autowired
  private EmailAccountClient client;

  @Bean
  public ItemReader<String> reader(){

      return new Reader(client)

  }
...