0

私の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のアノテーションは無視されます。

4

1 に答える 1

1

CrawlControllernewInstance簡単な呼び出しでクローラーのインスタンスを作成します。

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

これはいかなる種類の注入も行わないため、クローラーの注入されたフィールドはnullになります。

インジェクトされたクローラーを使用する場合は、クローラーを作成する方法を制御する必要がありますCrawlController。ただし、それを行う明確な方法はありません。その観点からはかなりひどく設計されています。

おそらくあなたがしなければならないことは、ドメインロジック(EJBに書き込むもの)をクローラークラスから分離し、必要に応じてEJBを呼び出す単純なnewInstance対応のクローラークラスを作成することです。EJB自体はクローラーではありません。JNDIを使用してEJBへの参照を取得できます。

于 2012-07-01T13:04:36.213 に答える