2013-06-27 3 views
1

Я пытаюсь интегрировать Spring с Vaadin, но я не могу использовать аннотацию @Autowired в своих классах Vaadin.@Autowired не работает в Spring и Vaadin интеграции

Во-первых, я создал последовавшей структуру Maven

enter image description here

Это мой 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> 

Это мой приложений 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)} 
+0

IIRC, классы GUI GWT, переведены в Javascript для выполнения в браузере. Таким образом, вы не можете добавить поддержку Spring в классы GUI (вы можете добавить ее в классы backend/server). – SJuan76

+0

Прошло много времени с тех пор, как я использовал GWT. – SJuan76

+0

@ SJuan76 UserPanel расширяет VericalLayout, поэтому он не переводится на javascript, это код на стороне сервера. – herman

ответ

0

Попробуйте объявить UserService на applicationContext.xml

<bean name="userService" class="com.mycompany.services.UserService"></bean> 
+0

Это аннотируется с @Service, так что это не обязательно. – herman

+0

не работает в обоих направлениях, почему? Я становлюсь сумасшедшим !!! – Skizzo

+0

@ user2069976 см. Мой другой ответ: я не думаю, что это проблема с 'UserService', но с' UserPanel': он не создан фабрикой Spring bean. – herman

0

Насколько я знаю,

Injector.inject(this); 

не что-то с весны, вы можете смешивать его с другой базы.

Вместо этого я бы сделал UserPanel компонентом Spring с компонентом прототипа (это означает, что его можно создать и авторизовать весной, но вы останетесь ответственным за его жизненный цикл).

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

Обратите внимание, что новый экземпляр будет создан в любое время UserPanel извлекается из контекста (например, autowired в другом объекте). Лучше всего было бы непосредственно контролировать создание случаев, явно ссылаясь на

context.getBean(UserPanel.class) 

в нужное время.

+0

, если я помещаю аннотации компонентов и области видимости в UserPanel, тогда при попытке выполнить context.getBean (UserPanel.class) я получаю эту ошибку: не определен уникальный бит типа [com.aiem.ui.UserPanel]: ожидаемый одиночный бит но найдено 0: – Skizzo

+0

@ user2069976 У вас есть '', но ваш класс 'UserPanel' находится в' com.aiem.ui'. Или вы изменили xml, прежде чем публиковать свой вопрос? – herman

+0

btw Весна должна регистрировать компоненты, которые она создает, чтобы вы могли также проверить свою регистрацию. – herman

0

AnnotationConfigWebApplicationContext не предназначен для использования с конфигурацией XML. Предполагается, что он будет использоваться с аннотированными классами @Configuration.

Поскольку вы используете файл XML для Spring конфигурации, то вместо него вы должны удалить эти строки из web.xml:

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

И тогда по умолчанию Spring будет использовать XmlWebApplicationContext и забрать ваш xml-файл.

0

Я пробовал тот же сценарий, что и вы. В конце решение находится на уровне Vaadin documentation.

Похоже, проблема заключается в том, что мы используем контекст Vaadin, а не Spring, и поэтому нам нужно сделать трюк, указанный в документации (SpringHelper), для получения любого компонента. Вне контекста Spring, автоустановка не предназначена для работы.