我在liferay portlet中使用Spring @Service类来获取和存储数据。它们是使用@autowired注释注入的。一切都按预期工作。当我试图在Liferay BaseIndexer子类中使用相同的方法(将数据放入搜索引擎)时,@ autowired带注释的类都为空(未注入)。
有没有办法在Indexer中获取这些Service类?
致以最诚挚的问候,
丹尼尔
答案 0 :(得分:3)
此索引器未由Spring实例化,因此您无法自动提供服务。
但是,您可以实现自定义ApplicationContextProvider(实现Spring ApplicationContextAware)并使用它来注入您的服务。应该很容易。
你应该开始创建这个类,让Spring发现它(确保春天扫描这个类):
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* Created by Alberto Martínez Ballesteros on 18/03/16.
*/
@Component("applicationContextProvider")
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context = null;
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
}
然后,您可以使用此ApplicationContextProvider在索引器类中注入您的服务:
例如:
public class CategoryIndexer extends BaseIndexer {
private CategoryService categoryService;
[....]
@Override
protected void doReindex(String className, long classPK) throws Exception {
if (categoryService == null) {
initService();
}
final Category category = categoryService.get(classPK);
doReindex(category);
}
private void initService() {
categoryService = (CategoryService) ApplicationContextProvider.getApplicationContext()
.getBean("categoryService");
}
[....]
正如您所看到的,您无法以这种方式使用@Autowired,但无论如何您都可以注入您的bean。
问候。