0

我的 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 中的注释被忽略。

4

1 回答 1

1

CrawlControllernewInstance通过一个简单的调用创建爬虫实例:

http://code.google.com/p/crawler4j/source/browse/src/main/java/edu/uci/ics/crawler4j/crawler/CrawlController.java#149

这不会进行任何类型的注入,因此您的爬虫的注入字段将为空。

如果你想使用注入爬虫,那么你需要控制CrawlController创建爬虫的方式。但是,没有明显的方法可以做到这一点。从这个角度来看,它的设计相当糟糕。

您可能需要做的是将域逻辑(您在 EJB 中编写的内容)与爬虫类分开,并编写一个简单的、支持 newInstance 的爬虫类,该类在适当的时候调用 EJB。EJB 本身不会是一个爬虫。您可以使用 JNDI 获取对 EJB 的引用。

于 2012-07-01T13:04:36.213 回答