【问题标题】:Why Vaadin @Autowired service returns null .?为什么 Vaadin @Autowired 服务返回 null .?
【发布时间】:2014-06-18 12:12:27
【问题描述】:

这是我的代码

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);
    }

}

这是我的 spring 上下文 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

请帮我解决这个问题

谢谢大家

【问题讨论】:

  • 将 AddressbookUI 标记为 @Component
  • AddressbookUI @Configurable?
  • @NikhilTalreja : 亲爱的朋友感谢您的评论。我会尝试您的建议并让您知道
  • @AndreiStefan : 亲爱的朋友也感谢您的评论。我尝试使用@configurable。但我放入了服务类。UI 类可以添加@Configurable。?我会检查并告诉你
  • @NikhilTalreja : 还是一样的错误

标签: spring vaadin


【解决方案1】:

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

但是,编写一个通过 Spring 容器创建 UIsUIProvider 是一项简单的任务,我已经回答了这个 here

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

【讨论】:

    【解决方案2】:

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

    这个 bean 必须由 spring 实例化和注入才能执行它的自动装配。

    【讨论】:

    • 谢谢亲爱的朋友。但是如何按照你在spring context.xml中说的进行实例化。?你能给我一个建议吗?可配置和组件注释还不够。?
    【解决方案3】:

    据我所知,您不能将 spring 与 vaadin 一起使用。它可能在 vaadin 运行的范围的最后失败(接近会话范围,但不是真的)。因此,您可以使用https://github.com/peholmst/vaadin4spring 来运行它。一旦使用 @VaadinUI 注释,您的 UI 子类将获得自动装配。

    【讨论】:

    • 感谢您的想法,亲爱的朋友。这意味着没有解决方案可以免除 vaadin4spring
    猜你喜欢
    • 2016-10-28
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2022-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多