1

と統合しようとしてSpringいますが、Vaadin クラスで注釈をVaadin使用できません。@Autowired

まず、次のMaven構造を作成しました

ここに画像の説明を入力

これは私のweb.xmlです

<web-app>
<display-name>Vaadin Web Application</display-name>
<context-param>
<description>Vaadin production mode</description>
<param-name>productionMode</param-name>
<param-value>false</param-value>
</context-param>

<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/application-context.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>Vaadin Application Servlet</servlet-name>
<servlet-class>com.mycompany.config.AutowiringApplicationServlet</servlet-class>

<init-param>
<description>Vaadin UI to display</description>
<param-name>UI</param-name>
<param-value>com.mycompany.ui.MyUI</param-value>
</init-param>
</servlet>

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

</web-app>

これは私のapplication-context.xmlです

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost/vaadin" />
<property name="username" value="postgres" />
<property name="password" value="tobbis" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="datasource"/>
<property name="persistenceUnitName" value="myUnit"/>
</bean>


<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<jpa:repositories base-package="com.mycompany.repository"></jpa:repositories>

<context:annotation-config/>
<context:component-scan base-package="com.mycompany" />

今、私はパッケージUserService内にあるものを作成しましたcom.mycompany.services

@Service
public class UserService {

public void saveUser(User user){

    System.out.println("Test to Save");

}
}

そして最後に、サービスを注入したいパネルがあります

public class UserPanel extends VerticalLayout {


@Autowired
UserService service;

public UserPanel() {
    // TODO Auto-generated constructor stub
    Injector.inject(this);

    service.saveUser();
}

}

しかし、結果は常に同じです

 Error creating bean with name 'com.mycompany.ui.UserPanel': Injection of autowired dependencies failed; 
 nested exception is org.springframework.beans.factory.BeanCreationException:
 Could not autowire field: com.mycompany.services.UserService com.mycompany.ui.UserPanel.service; 
 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
 No matching bean of type [com.aiem.services.UserService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
 Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
4

5 に答える 5

0

AnnotationConfigWebApplicationContextXML 構成で使用するためのものではありません。@Configuration注釈付きクラスで使用することになっています。

Spring 構成に xml ファイルを使用しているため、代わりにこれらの行を web.xml から削除する必要があります。

<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

デフォルトでは、Spring は を使用XmlWebApplicationContextして xml ファイルを取得します。

于 2013-09-01T14:53:19.943 に答える
0

私の知る限りでは、

Injector.inject(this);

Spring のものではありません。別のフレームワークと混合している可能性があります。

代わりにUserPanel、プロトタイプ スコープの Spring コンポーネントを作成します (つまり、Spring によってインスタンス化およびオートワイヤリングできますが、そのライフサイクルについては引き続き責任を負います)。

@Component
@Scope(SCOPE_PROTOTYPE)
public class UserPanel extends VerticalLayout {

コンテキストから取得されたときはいつでも新しいインスタンスが作成されることに注意してくださいUserPanel(たとえば、別のオブジェクトで自動配線されます)。明示的に呼び出して、インスタンスの作成を自分で制御するのが最善の方法です

context.getBean(UserPanel.class)

適切な時に。

于 2013-06-27T15:46:23.000 に答える