2016-03-05 65 views
0

我使用Vaadin 7,Spring Data JPA 1.9.4.RELEASE和Vaadin-Spring 1.0.0,我有一些DI問題。Vaadin Spring沒有啓動:依賴注入問題

我選擇不使用Spring的引導,因爲它會自動做太多的事情,我不能「看」和我所遇到的章若干問題的是花了我太多的時間去了解,並找到原因,所以我寧願不開機。

我遇到的問題是DI在根用戶界面而不是根用戶界面的子窗口中工作。

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(); 
    } 
} 
+0

Spring可以爲它管理的組件自動裝入字段。如果你實例化這些對象,Spring將不會知道automagic將不會發生。你想要做的是告訴Spring'PersonForm'是它的一個組件,並且從它的初始化上下文中請求一個實例。 – Morfic

回答

0

嘗試來註釋P ersonForm和一些像@Component一樣的Spring註解。或者,最好嘗試使用vaadin-spring @SpringView的註釋。

+0

'@ Component'應該可以工作,但是我不明白你爲什麼會嘗試使用'@SpringView,畢竟這不是Vaadin視圖...但是 – Morfic

+0

@Component是我錯過的。謝謝。 –