0

起動時にクラス一覧プロパティを設定する目的は何ですか? コードを見ると、再スキャンが必要かどうかを確認するために使用されているようです。理由は何ですか?

このリストが必須である場合は、チェックされていない list.get(0) をほぼすべての場所で実行しているため、起動時に必須のチェックを行うだけではどうですか。リストが何に使用されているかを理解したら、実際にいくつかの値を入力できるようになるかもしれません。

4

1 に答える 1

1

再スキャンを使用する必要はありません。これは主に、playframework のようなフレームワーク用です。playframework では、サーバーを再起動しない理由は、クラスを再コンパイルして「新しい」クラスローダーに配置するためです。つまり、これらの新しくリロードされたクラスが「再スキャン」されない場合、コントローラーで問題が発生します。この再スキャン方法は、playframework の開発モード専用です。実際には、再スキャンはおそらく api ではなく、impl に移動する必要があります。現在、NoSql.em(); のように EntityManager を取得するために playframework で使用される NoSql によって使用されます。

NoSql.java の次のコードは rescan(注: if newClass == testClass のテストはエンティティ Car.class == Car.class のテストであり、2 つの Car.class が等しくない場合は、 playframework はそのクラスをリロードし、それらの新しいクラスを再スキャンする必要があります....休止状態のエンティティも再スキャンする必要があるため、休止状態に対して同じことを行います。

@SuppressWarnings("rawtypes")
private static void testForRescan() {
    List<Class> classesToScan = playCallback.getClassesToScan();
    Class newClass = classesToScan.get(0);
    if(newClass == testClass)
        return;

    //otherwise, we need a rescan of all the new classes
    ClassLoader cl = playCallback.getClassLoader();
    factory.rescan(classesToScan, cl);
    testClass = newClass;
}

playframework プラグインを開発するまでは、playframework を使用している場合は、PlayCallback インターフェース (WebFrameworkCallback に名前を変更する必要があります) を実装する必要があります。

private static class OurPlayCallback implements PlayCallback {
    @Override
    public List<Class> getClassesToScan() {
        return Play.classloader.getAnnotatedClasses(NoSqlEntity.class);
    }

    @Override
    public ClassLoader getClassLoader() {
        return Play.classloader;
    }

    @Override
    public Object getCurrentRequest() {
        return Http.Request.current.get();
    }
}

基本的に、playframework プラグインを実行するまでは、起動時に上記の実装で playOrm を初期化し、これを呼び出して NoSql.java クラスを初期化できます (起動時に一度だけ呼び出してください!!!!)。

 NoSql.initialize(new OurPlayCallback(), db, builder);
于 2012-09-20T11:55:10.487 に答える