Проблема JavaConfig в веб-приложении (Vaadin + Spring) - PullRequest
0 голосов
/ 24 сентября 2011

ОБНОВЛЕНО

Я нашел подозрительную запись в журнале:

org.springframework.beans.factory.wiring.BeanConfigurerSupport:

BeanFactory has not been set on BeanConfigurerSupport: Make sure this configurer runs  in a Spring container. 
Unable to configure bean of type [com.mycompany.projectname.App]. Proceeding without injection.

/ ОБНОВЛЕНО

Я работаюв приложении Vaadin + Spring, и я хочу использовать JavaConfig.

В соответствии с некоторыми уроками я построил их отдельно, но когда я их слил, я получил следующее (см. Первый codennet App.java - logger.info (">> mainWindow is null");)

app postconstruct --------- 
mainWindow is null

Я попробовал несколько вариантов конфигов, например, в applicationContext и т. Д.

Итак, мой вопрос: как я могу найти реальную проблему?

Спасибо за ваше время и усилия заранее.

Csaba

App.java

@Configurable
public class App extends Application
{
    public MainWindow mainWindow;    
    public MainWindow getMainWindow(...
    public void setMainWindow(Main....


    @PostConstruct
    public void init()
    {
        logger.info(">>app postconstruct --------- ");
        if(mainWindow==null) logger.info(">>mainWindow is null");
        else logger.info(">>mainWindow is not null");
    }

AppConfig.java

    @Configuration
    public class AppConfig {
    ...
    @Bean
    public MainWindow mainWindow(){
            return new MainWindow();
    }
    ....    
    }

web.xml на основе этой ! учебной ссылки!

...
<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>com.mycompany.projectname.config.AppConfig</param-value>
</context-param>  
...

<servlet>
    <servlet-name>Vaadin Application Servlet</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.mycompany.projectname.App</param-value>
    </init-param>

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

    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>com.mycompany.projectname.config.AppConfig</param-value>
    </init-param>    
</servlet>

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Почему вы используете @Configurable? Вы хотите использовать вместо этого @Component?

@ Configurable обычно используется в объектах домена (или объектах), которые не являются объектами, управляемыми Spring, чтобы они могли получать инъекции зависимостей из контейнера Spring. Это не похоже на вашу цель. Вероятно, вам следует просто подключить свой класс «App» к другому методу @Bean или пометить его с помощью @Component и выбрать его с помощью компонентного сканирования (например, с @ComponentScan). Для получения дополнительной информации см. Соответствующий Javadoc и справочную документацию по этим аннотациям.

1 голос
/ 29 сентября 2011

Ваши аннотации не будут работать, если вы их не включили.

У вас есть следующее в xml-контексте контекста проекта?

<!-- Activate Spring annotation support -->
<context:spring-configured/>

<!-- Turn on @Autowired, @PostConstruct etc support -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="com.tc.poc.vaddinspring" />

Обновление: посмотрите на этот скелет .

...