Vaadin Spring 无法启动:依赖注入问题
Vaadin Spring no boot : Dependency Injection issue
我正在使用 Vaadin 7、Spring Data JPA 1.9。4.RELEASE 和 Vaadin-Spring 1.0.0,我遇到了一些 DI 问题。
我选择不使用 Spring 引导,因为它会自动做太多我不能做的事情 "see" 而且我遇到了一些问题,花了我太多时间去理解和查找原因, 所以我更喜欢不开机。
我遇到的问题是 DI 在根 UI 上工作,但在根 UI.
的子 window 上不工作
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 注释来注释您的 PersonForm,例如 @Component。或者最好尝试使用来自 vaadin-spring @SpringView.
的注释
我正在使用 Vaadin 7、Spring Data JPA 1.9。4.RELEASE 和 Vaadin-Spring 1.0.0,我遇到了一些 DI 问题。
我选择不使用 Spring 引导,因为它会自动做太多我不能做的事情 "see" 而且我遇到了一些问题,花了我太多时间去理解和查找原因, 所以我更喜欢不开机。
我遇到的问题是 DI 在根 UI 上工作,但在根 UI.
的子 window 上不工作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 注释来注释您的 PersonForm,例如 @Component。或者最好尝试使用来自 vaadin-spring @SpringView.
的注释