我的 Java EE 应用程序使用crawler4j,它使用以下代码开始爬网:
CrawlConfig config = new CrawlConfig();
config.setCrawlStorageFolder("C:/crawler4j_storage");
PageFetcher pageFetcher = new PageFetcher(config);
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
controller.start(Crawler.class, 1);
EJB 被注入到 Crawler.class 中:
@Stateless
@LocalBean
public class Crawler extends WebCrawler {
@Inject private SeedFacadeLocal seedEJB;
public void doSomething () {
seedEJB.findAll(); // gives the NullPointerException
}
我的猜测是它与 Crawler.class 作为参数传递的方式有关。SeedFacadeLocal 是一个具有@Stateless bean 实现的@Local bean 接口。我在许多其他地方注入了这个 bean,它工作正常。
我认为通过使用“controller.start(Crawler.class, 1)”开始爬网会导致 Crawler.class 成为 POJO 而不是 EJB。因此 Crawler.class 中的注释被忽略。