0

我是 scala 和 vaadin 的新手,我只是在尝试。我正在尝试在我的 scala vaadin 应用程序中使用 spring 应用程序上下文和 spring di,但无法获取要注入的数据源。我不知道,也许我在做一些根本错误的事情,但这是我的代码:

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>

<context-param>
    <description>
    Vaadin production mode</description>
    <param-name>productionMode</param-name>
    <param-value>false</param-value>
</context-param>
<servlet>
    <servlet-name>Scalatest Application</servlet-name>
    <servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet</servlet-class>
    <init-param>
        <description>Vaadin application class to start</description>
        <param-name>application</param-name>
        <param-value>com.example.scalatest.ScalaApp</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>Scalatest Application</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

应用上下文:

<bean id="main" class="com.example.scalatest.ScalaApp">
    <property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="url"/>
    <property name="username" value="root"/>
    <property name="password" value="pass"/>
</bean>

在我的 scala 课上

var dataSource:DataSource = _;  
def setDataSource(datasource:DataSource){
dataSource = datasource;
}

不工作, ds 在启动时为空。有人可以指导我吗?

4

1 回答 1

1

您遇到的主要问题是您的应用程序(ScalaApp)不是由 Spring 容器实例化,而是由 VaadinServlet 实例化- 确保它确实如此。有几种策略。这是可以帮助您的示例项目:https ://github.com/archiecobbs/dellroad-stuff-vaadin-spring-demo3

还有几条建议...

无需自己编写 setter,而是将 @BeanProperty 注释添加到您的变量中。Scala 编译器将为您的变量生成 setter 和 getter:

@BeanProperty private var dataSource:DataSource = _

还有更好的方法——使用 Spring 的基于注解的容器配置。如果您的上下文中只有一个类型DataSource的 bean,只需添加@Autowired到您的变量中(不需要在上下文文件中定义 xml - 您的类应该注释为 @Component ):

@Component
class ScalaApp {
   @Autowired private var dataSource:DataSource = _ 
}

这里有更多信息:http ://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-annotation-config

于 2012-07-18T01:06:56.263 回答