Клиент Feign всегда выдает исключение нулевого указателя в приложении Spring boot/Crawler4j.

Я запускаю экземпляр Crawler4j в загрузочном приложении Spring, и мой клиент OpenFeign всегда равен нулю.

public class MyCrawler extends WebCrawler {

@Autowired
    HubClient hubClient;

    @Override
    public void visit(Page page) {
// Lots of crawler code...
        if (page.getParseData() instanceof HtmlParseData) {
            hubClient.send(webPage.toString()); // Throws null pointer exception
}
}

Мой хабклиент

@FeignClient("hub-worker")
public interface HubClient {
    @RequestMapping(method = RequestMethod.POST, value = "/pages", consumes = "application/json")
    void send(String webPage);
    //void createPage(WebPage webPage);
}

Мое основное приложение

@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class CrawlerApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(CrawlerApplication.class, args);
    }
}

трассировка стека


ext length: 89106
Html length: 1048334
Number of outgoing links: 158
10:14:38.634 [Crawler 164] WARN  e.u.ics.crawler4j.crawler.WebCrawler - Unhandled exception while fetching https://www.cnn.com: null
10:14:38.634 [Crawler 164] INFO  e.u.ics.crawler4j.crawler.WebCrawler - Stacktrace: 
java.lang.NullPointerException: null
    at com.phishspider.crawler.MyCrawler.visit(MyCrawler.java:79)
    at edu.uci.ics.crawler4j.crawler.WebCrawler.processPage(WebCrawler.java:523)
    at edu.uci.ics.crawler4j.crawler.WebCrawler.run(WebCrawler.java:306)
    at java.base/java.lang.Thread.run(Thread.java:834)

Строка 79 — это вызов hubClient. Когда я выделяю hubVlient в другой класс, который я создаю в классе сканера, например hubclient hc = new hubclient(), а затем использую некоторый метод hc.send(page), hubClient в этом факторизованном классе выдает нулевой указатель.


person Nikolai Manek    schedule 12.04.2020    source источник
comment
Здравствуйте, не могли бы вы добавить трассировку стека?   -  person Mykhailo Moskura    schedule 12.04.2020
comment
@MykhailoMoskura - Извините, да. Только что сделал.   -  person Nikolai Manek    schedule 12.04.2020
comment
Является ли hubClient нулевым, когда вы вводите его, или webPage.toString() возвращает null?   -  person Mykhailo Moskura    schedule 12.04.2020
comment
hubClient имеет значение null.   -  person Nikolai Manek    schedule 12.04.2020
comment
Вы регистрируете MyCrawler как bean весной?   -  person Mykhailo Moskura    schedule 12.04.2020
comment
Я думаю, проблема в том, что вам нужно пометить MyCrawler через аннотацию @Service   -  person Mykhailo Moskura    schedule 12.04.2020
comment
Я пробовал @Service, и это не помогло.   -  person Nikolai Manek    schedule 13.04.2020
comment
Давайте продолжим это обсуждение в чате.   -  person Mykhailo Moskura    schedule 13.04.2020


Ответы (1)


Чтобы внедрить bean-компоненты Spring (ваш клиент) в ваш объект веб-сканера Crawler4j, вам необходимо создать экземпляр объекта веб-сканера через Spring.

Для этого вам необходимо написать собственную реализацию WebCrawlerFactory, который предоставляет/создает объекты поискового робота, управляемые Spring. Для этого ваша реализация поискового робота должна быть Spring Bean, то есть, по крайней мере, иметь аннотацию @Component.

person rzo1    schedule 01.06.2020