Основанный на аннотациях Spring Activiti ProcessEngine

Я новичок в Spring и Activiti. Я разрабатываю веб-приложение Spring на основе аннотаций со встроенным движком Activiti. У меня есть несколько сервисов, SubscriptionService — один из них. В одном процессе я называю эту службу bean-компонентом:

activiti:expression="${subscriptionService.getContacts(publisherCode, contactType)}"

Обслуживание:

@Service
@Transactional
public class DBSubscriptionService implements SubscriptionService {
...
}

Я разделил тестовый модуль и веб-модуль. Тестовый модуль загружает контекст из activiti.cfg.xml с

@ContextConfiguration("classpath:activiti.cfg.xml")

и это:

<bean id="processEngineConfiguration"
    class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
    <property name="databaseType" value="h2" />
    <property name="databaseSchemaUpdate" value="true" />
    <property name="jobExecutorActivate" value="false" />
    <property name="history" value="full" />
    <property name="mailServerPort" value="2025" />
</bean>

<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
    <property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

<bean id="repositoryService" factory-bean="processEngine"
    factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine"
    factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine"
    factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine"
    factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine"
    factory-method="getManagementService" />
<bean id="identityService" factory-bean="processEngine"
    factory-method="getIdentityService" />
<bean id="formService" factory-bean="processEngine"
    factory-method="getFormService" />

<context:component-scan base-package="cz.muni.fi.cep" />
<context:annotation-config />

В тестовом модуле все работает нормально. Но в веб-модуле, когда он должен вызвать bean-компонент подписки, он выдает:

    Unknown property used in expression: ${subscriptionService.getContacts(publisherCode, contactType)}
Caused by: org.activiti.engine.impl.javax.el.PropertyNotFoundException: Cannot resolve identifier 'subscriptionService'
    at org.activiti.engine.impl.juel.AstIdentifier.eval(AstIdentifier.java:83)
    at org.activiti.engine.impl.juel.AstMethod.invoke(AstMethod.java:79)
    at org.activiti.engine.impl.juel.AstMethod.eval(AstMethod.java:75)
    at org.activiti.engine.impl.juel.AstEval.eval(AstEval.java:50)
    at org.activiti.engine.impl.juel.AstNode.getValue(AstNode.java:26)
    at org.activiti.engine.impl.juel.TreeValueExpression.getValue(TreeValueExpression.java:114)
    at org.activiti.engine.impl.delegate.ExpressionGetInvocation.invoke(ExpressionGetInvocation.java:33)
    at org.activiti.engine.impl.delegate.DelegateInvocation.proceed(DelegateInvocation.java:37)
    at org.activiti.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocation(DefaultDelegateInterceptor.java:25)
    at org.activiti.engine.impl.el.JuelExpression.getValue(JuelExpression.java:48)
    ... 363 more

Итак, я понимаю, что проблема в том, что движок процесса не использует правильный контекст приложения, потому что служба подписки автоматически подключается к другим классам. Но я не знаю, как это исправить.

Веб-модуль основан исключительно на аннотациях:

@EnableAutoConfiguration
@Configuration
@EntityScan(basePackages = "cz.muni.fi.cep")
@ComponentScan(basePackages = "cz.muni.fi.cep")
public class App extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    ...
} 

И конфигурация Активити:

@Configuration
public class ActivitiConfig {

    @Bean
    public ProcessEngine processEngine(ProcessEngineConfigurationImpl pec, ApplicationContext applicationContext) throws Exception {
        ProcessEngineFactoryBean pe = new ProcessEngineFactoryBean();
        pe.setProcessEngineConfiguration(pec);
        pe.setApplicationContext(applicationContext);

        return pe.getObject();
    }

    @Bean
    public ProcessEngineConfigurationImpl getProcessEngineConfiguration(
            DataSource dataSource,
            PlatformTransactionManager transactionManager,
            ApplicationContext context) {
        SpringProcessEngineConfiguration pec = new SpringProcessEngineConfiguration();

        pec.setDataSource(dataSource);
        pec.setDatabaseSchemaUpdate("true");
        pec.setJobExecutorActivate(true);
        pec.setHistory("full");
        pec.setMailServerPort(2025);
        pec.setDatabaseType("mysql");

        pec.setTransactionManager(transactionManager);
        pec.setApplicationContext(context);

        return pec;
    }

    @Bean
    public RuntimeService getRuntimeService(ProcessEngine processEngine) {
        return processEngine.getRuntimeService();
    }
...
}

Кроме того, возможно, порядок создания контекста как-то связан с этим.


person AdiC    schedule 17.01.2015    source источник
comment
Все выглядит нормально, я полагаю, что это может быть что-то столь же простое, как не сканируемая служба подписки (принадлежит ли она пакету cz.muni.fi.cep?), или Spring назначает другое имя компоненту службы подписки (например, dbSubscriptionService или dBSubscriptionService). вместо просто службы подписки). Попробуйте заменить @Service в классе DBSubscriptionService на @Service(subscriptionService).   -  person fps    schedule 18.01.2015
comment
Да! Оно работает! Спасибо много!   -  person AdiC    schedule 18.01.2015
comment
Хорошо, тогда я напишу это как ответ.   -  person fps    schedule 18.01.2015
comment
Отличное предложение Magnamag, так как он был изначально настроен, Spring, вероятно, зарегистрировал бы службу как DBSubscriptionService.   -  person Greg Harley    schedule 19.01.2015
comment
Я не рассматривал этот вариант, потому что в тестовом пакете он работал нормально   -  person AdiC    schedule 19.01.2015


Ответы (1)


Все выглядит нормально, я полагаю, что это может быть что-то столь же простое, как не сканируемая служба подписки (принадлежит ли она пакету cz.muni.fi.cep?), или Spring назначает другое имя компоненту службы подписки (например, dbSubscriptionService или dBSubscriptionService вместо просто subscriptionService).

Попробуйте заменить @Service в классе DBSubscriptionService на @Service("subscriptionService"), и это должно сработать.

person fps    schedule 18.01.2015