为什么Vaadin @Autowired服务返回null。

时间:2014-06-18 12:12:27

标签: spring vaadin

这是我的代码

public class AddressbookUI extends UI {
    @Autowired
    private AddressService addressService;

.....在我的方法中

            Contact contact=new Contact();
            contact.setName("Test");
            contact.setCity("Colombo");
            addressService.addContact(contact);

这是我的服务类

@Service
@Repository
public class AddressServiceImpl implements AddressService {

    private SessionFactory sessionFactory;

    @Transactional
    public void addContact(Contact contact) {
        sessionFactory.getCurrentSession().saveOrUpdate(contact);
    }

}

这是我的春天语境xml

<import resource="databaseContext.xml" />
<context:annotation-config />
<context:component-scan base-package="com.priyan.vaadin" />
<context:spring-configured />
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="packagesToScan" value="com.priyan.vaadin" />
    <property name="dataSource" ref="dataSource"></property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>classpath:jdbc.properties</value>
    </property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"></property>
    <property name="url" value="${jdbc.url}"></property>
    <property name="username" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
</bean>

这是我的web.xml

<context-param>
        <description>Vaadin production mode</description>
        <param-name>productionMode</param-name>
        <param-value>true</param-value>
    </context-param>

    <servlet>
        <servlet-name>Vaadin</servlet-name>
        <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
        <init-param>
            <description>Vaadin UI to display</description>
            <param-name>UI</param-name>
            <param-value>com.priyan.vaadin.AddressbookUI</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>Vaadin</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/applicationContext.xml</param-value>
    </context-param>

所有其他的工作正常。页面也很好地加载。 但是当我按下保存按钮时,它会转到那些行,而在服务呼叫点,它会返回null

请帮我解决这个问题

感谢所有

3 个答案:

答案 0 :(得分:1)

AddressbookUI未显示由spring管理。它是用new实例化的吗?

这个bean必须实例化并通过spring注入才能进行自动装配。

答案 1 :(得分:1)

您目前正在使用通过UIProvider实例化UIs的默认Class.newInstance(),因此Spring容器无法在AddressbookUI类中自动装配字段。

但是,编写一个通过Spring容器创建UIProvider的{​​{1}}是一项简单的任务,我已经回答了here

还有一些开源库将Vaadin与Spring(包括我的)集成在一起。只需在Vaadin Directory中搜索Spring。

答案 2 :(得分:0)

据我所知,你不能在开箱即用的情况下使用带有vaadin的弹簧。它可能在vaadin运行的范围的最后失败(接近会话范围,但不是真的)。因此,您可以使用https://github.com/peholmst/vaadin4spring来实现此功能。一旦使用@VaadinUI注释,您的UI子类将接受自动装配。