【问题标题】:Vaadin Spring no boot : Dependency Injection issueVaadin Spring 无法启动:依赖注入问题
【发布时间】:2016-03-05 18:34:20
【问题描述】:

我正在使用 Vaadin 7、Spring Data JPA 1.9.4.RELEASE 和 Vaadin-Spring 1.0.0,但我遇到了一些 DI 问题。

我选择不使用Spring Boot,因为它会自动做太多我“看不到”的事情,而且我遇到了一些问题,花了我太多时间去理解和寻找原因,所以我更喜欢不启动。

我遇到的问题是 DI 在根 UI 上工作,但不适用于根 UI 的子窗口。

RootUI.java

@SpringUI(path = "/")
public class RootUI extends UI {
    @Autowired
    private EntityManagerFactory entityManagerFactory; // this one works, but I cannot get EntityManager directly

    @Autowired
    private ClassService classService;   // this one works


    @Override
    protected void init(VaadinRequest request) {
        ...

        PersonForm form = new PersonForm();
        CssLayout layout = new CssLayout();
        layout.addComponent(form);
        Window subWindow = new Window();
        subWindow.setContent(layout);
        ...
    }
}

PersonForm.java

public class PersonForm {

    @Autowired
    private ClassService classService; // this doesnot work, 

    public PersonForm(ClassService classService) {
        classService.findByName();// since the @Autowired dosenot work, I have to pass the one from rootUI.

    }

    init() {
        classService.findByName();   // null exception
    }
}

DBConfig.java

@Configuration
@EnableVaadin
@EnableJpaRepositories(basePackages = {"com.example.person.repository"})
@EnableTransactionManagement
public class DBConfig {
    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.mysql.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false");
        config.setUsername("root");
        config.setPassword("root");
        config.setMaximumPoolSize(20);
        HikariDataSource dataSource = new HikariDataSource(config);
        return dataSource;
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);

        factory.setDataSource(dataSource());
        factory.setPackagesToScan("com.example.person");
        factory.setPersistenceProviderClass(HibernatePersistenceProvider.class);

        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
        jpaProperties.put("hibernate.hbm2ddl.auto", "update");
        factory.setJpaProperties(jpaProperties);

        factory.afterPropertiesSet();
        return factory.getObject();
    }
}

【问题讨论】:

  • Spring 可以为其管理的组件自动装配字段。如果你自己实例化这些对象,Spring 不会知道,所以自动魔法不会发生。您要做的是告诉 Spring PersonForm 是它的组件之一,并从其初始化的上下文中请求一个实例。

标签: spring vaadin vaadin7 vaadin4spring


【解决方案1】:

尝试使用 @Component 之类的 Spring 注解来注解您的 PersonForm。或者最好尝试使用来自 vaadin-spring @SpringView 的注释。

【讨论】:

  • @Component 应该可以工作,但是我不明白你为什么要尝试使用`@SpringView,毕竟这不是 Vaadin 视图......但是
  • @Component 是我错过的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2015-03-13
  • 2021-08-10
  • 1970-01-01
  • 2014-12-27
  • 2015-04-22
相关资源
最近更新 更多