私のJavaEEアプリは、次のコードを使用してクロールを開始する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は、@StatelessBean実装を持つ@LocalBeanインターフェースです。私はこの豆を他の多くの場所に注入し、それはうまく機能します。
「controller.start(Crawler.class、1)」でクロールを開始すると、Crawler.classがEJBではなくPOJOになると思います。そのため、Crawler.classのアノテーションは無視されます。