0

私はscalaとvaadinに不慣れで、実験しているだけです。私はscalavaadinアプリでSpringアプリケーションコンテキストとSpringDiを使用しようとしていますが、注入するデータソースを取得できません。私は知りません、多分私は根本的に間違ったことをしていますが、ここに私のコードがあります:

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はnullです。誰かが私を案内してくれますか?

4

1 に答える 1

1

あなたが抱えている主な問題は、アプリケーション (ScalaApp) が Spring コンテナーではなく VaadinServlet によってインスタンス化されていることです。インスタンス化されていることを確認してください。いくつかの戦略があります。これがあなたを助けることができるサンプルプロジェクトです: https://github.com/archiecobbs/dellroad-stuff-vaadin-spring-demo3

もう少しアドバイスを...

セッターを自分で記述する代わりに、変数に @BeanProperty アノテーションを追加します。Scala コンパイラは、変数のセッターとゲッターを生成します。

@BeanProperty private var dataSource:DataSource = _

さらに良い方法があります - Spring の注釈ベースのコンテナ構成を使用します。コンテキストにタイプの Bean が 1 つしかない場合は、変数DataSourceに追加@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 に答える