我正在尝试将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");
}
}
最后,我有我想要注入服务的Panel
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)}
答案 0 :(得分:0)
尝试在applicationContext.xml
声明 UserService<bean name="userService" class="com.mycompany.services.UserService"></bean>
答案 1 :(得分:0)
据我所知,
Injector.inject(this);
不是来自Spring的东西,你可能会将它与另一个框架混合。
相反,我会使UserPanel
成为一个原型范围的Spring组件(意味着它可以由Spring实例化并自动装配,但你仍然对它的生命周期负责。)
@Component
@Scope(SCOPE_PROTOTYPE)
public class UserPanel extends VerticalLayout {
请注意,只要从上下文中检索UserPanel
,就会创建一个新实例(例如,在另一个对象中自动装配)。最好通过显式调用
context.getBean(UserPanel.class)
在合适的时间。
答案 2 :(得分:0)
AnnotationConfigWebApplicationContext
不适用于XML配置。它应该与@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文件。
答案 3 :(得分:0)
我尝试过与你相同的场景。最后,解决方案位于Vaadin documentation。
似乎问题是我们使用的是Vaadin上下文而不是Spring上下文,因此我们需要在文档(SpringHelper)中显示获取任何bean的技巧。在Spring环境之外,自动装配不起作用。
答案 4 :(得分:0)
有一个插件可通过注释启用自动装配:http://vaadin.xpoft.ru/。 以下是Vaadin网站的链接:http://vaadin.com/addon/springvaadinintegration。希望它有所帮助。