我正在尝试将某些数据加载到应用程序开始时的数据库中。我有一个为此目的定义的豆
ApplicationContext.xml
<bean class="com.project.loader.DataLoader"
id="DataLoader"
depends-on="entityManagerFactory"
scope="singleton"/>
类:
@RooJavaBean
@RooConfigurable
public class DataLoader implements InitializingBean
它正在执行,但是在第一个persist()方法是呼叫的情况下,春季给我带来了错误:
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)
以下方式定义数据加载程序时,它以前正在工作:
@Component
@Configurable
public class DataLoader implements ApplicationListener
但是使用RAW类型不是很好的练习,所以我想切换
我该如何使它起作用?
春季版:3.1
过去,我已经通过将组件 - 扫描定义转移到应用程序上下文的末尾来解决此问题,如下所示
我使用spring smartlifecycle:http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/context/smartlifecycle.html
我已经创建了一个很好的类,可以扩展并覆盖运行方法:
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;
}