在Liferay索引器中使用Spring自动装配的Service类

时间:2016-03-15 12:35:51

标签: spring spring-mvc liferay autowired

我在liferay portlet中使用Spring @Service类来获取和存储数据。它们是使用@autowired注释注入的。一切都按预期工作。当我试图在Liferay BaseIndexer子类中使用相同的方法(将数据放入搜索引擎)时,@ autowired带注释的类都为空(未注入)。

有没有办法在Indexer中获取这些Service类?

致以最诚挚的问候,

丹尼尔

1 个答案:

答案 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。

问候。