use spring in vaadin

886 Views Asked by At

i want to use spring in vaadin
it's my config:
web.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>VaadinApplicationServlet</servlet-name>
        <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
        <init-param>
            <param-name>UI</param-name>
            <param-value>com.MyUI</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>VaadinApplicationServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

applicationContext.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver"/>
        <property name="url" value="jdbc:postgresql://localhost:5432/Activiti"/>
        <property name="username" value="postgres"/>
        <property name="password" value="10"/>
    </bean>

    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="databaseType" value="postgres"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="transactionManager" ref="transactionManager"/>
        <property name="databaseSchemaUpdate" value="true"/>
        <property name="deploymentResources"
                  value="classpath* : #{Init.path_Process}"/>
        <property name="history" value="audit"/>
        <property name="jobExecutorActivate" value="false"/>
    </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="formService" factory-bean="processEngine"
          factory-method="getFormService"/>
    <bean id="identityService" factory-bean="processEngine"
          factory-method="getIdentityService"/>

    <bean id="Init" class="util.Init"/>
    <context:annotation-config/>
    <context:component-scan base-package="com"/>    
    <context:spring-configured/>
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

in MyUI class:
#java
@Component
@Configurable
public class MyUI extends UI {
 protected void init(VaadinRequest vaadinRequest) {
...
@Autowired
    private IdentityService identityService;
...
}}

this config work in junit and Ok!
but
when run in vaadin and tomcat , java.lang.NullPointerException error for identityService
where is my problem?
thanks

3

There are 3 best solutions below

0
Stephane Nicoll On

com.MyUI is created by the Vaadin servlet and that servlet does not know about Spring. What's happening is that your UI instance is created by reflection and isn't a Spring managed bean.

You need to use a Vaadin plugin that integrates with Spring. Please check the vaadin4spring project for more details.

Maybe you should update the class to org.vaadin.spring.servlet.SpringAwareVaadinServlet?

0
riddy On

Try to autowire your bean explicite (e.g. in the constructor):

   if (VaadinServlet.getCurrent() != null) {
        try {
            WebApplicationContextUtils
                    .getRequiredWebApplicationContext(VaadinServlet.getCurrent().getServletContext())
                    .getAutowireCapableBeanFactory().autowireBean(this);
        } catch (BeansException e) {
            LOG.error("Could not inject beans!" + this.getClass(), e); //$NON-NLS-1$
        }
    }
0
Samet Sevim On

You may use ru.xpoft.vaadin.SpringVaadinServlet, check Vaadin website-addons

<servlet>
    <servlet-name>MyCustom Application</servlet-name>
      <servlet-class>ru.xpoft.vaadin.SpringVaadinServlet</servlet-class> ...............