1

アプリケーションの起動時に、DB にデータをロードしようとしています。この目的のために定義されたBeanがあります

applicationContext.xml

<bean class="com.project.loader.DataLoader" 
id="DataLoader" 
depends-on="entityManagerFactory" 
scope="singleton"/>

クラス:

@RooJavaBean
@RooConfigurable
public class DataLoader implements InitializingBean

それは実行されていますが、最初のpersist()メソッドが呼び出されると、Springは次のエラーをスローします:

Caused by: java.lang.IllegalStateException: Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)
at com.project.lib.model.extensions.i18n.Locale_Roo_Jpa_ActiveRecord.entityManager_aroundBody0(Locale_Roo_Jpa_ActiveRecord.aj:19)
at com.project.lib.model.extensions.i18n.Locale_Roo_Jpa_ActiveRecord.ajc$interMethod$com_project_lib_model_extensions_i18n_Locale_Roo_Jpa_ActiveRecord$com_project_lib_model_extensions_i18n_Locale$entityManager(Locale_Roo_Jpa_ActiveRecord.aj:1)
at com.project.lib.model.extensions.i18n.Locale.entityManager(Locale.java:1)

以前は、次の方法で DataLoader を定義したときに機能していました。

@Component
@Configurable
public class DataLoader implements ApplicationListener

しかし、生の型を使用することは良い習慣ではないので、切り替えたいと思います

どうすればそれを機能させることができますか?

春のバージョン: 3.1

4

2 に答える 2

0

春の SmartLifecycle を使用します: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/SmartLifecycle.html

これを適切に行うクラスを作成しました。run メソッドを拡張してオーバーライドするだけです。

public abstract class StartupService implements SmartLifecycle {
/** Logger for this class and subclasses */
protected static final Logger logger = LoggerFactory.getLogger(StartupService.class);

protected boolean running=false;

////////////////////// Lifecycle Methods \\\\\\\\\\\\\\\\\\
@Override
public void start() {
    try {
        logger.info("starting {}", this.getClass().getSimpleName());
        run();
    } catch (Exception e) {
        logger.error("failed to run importer", e);
    }
}

@Override
public void stop() {
    running=false;
}

@Override
public boolean isRunning() {
    return running;
}

////////////////////// SmartLifecycle Methods \\\\\\\\\\\\\\\\\\
@Override
public boolean isAutoStartup() {
    return true;
}

@Override
public void stop(Runnable callback) {
    stop();
    callback.run();
}

@Override
public int getPhase() {
    return 0;
}

public abstract void run() throws Exception;
}
于 2012-11-15T21:34:42.133 に答える
0

ここで提案されているように、コンポーネントスキャン定義をアプリケーションコンテキストの最後に移動することで、過去にこの問題を解決しました

于 2012-11-08T22:48:20.213 に答える