簡體   English   中英

帶有 Autowired Spring JPA bean 的 Vaadin 構造函數

[英]Vaadin constructor with Autowired Spring JPA beans

我有一個 Spring 引導應用程序

@SpringBootApplication
public class TaxApplication {

  private static final Logger log = LoggerFactory.getLogger(TaxApplication.class);

  public static void main(String[] args) {
    SpringApplication.run(TaxApplication.class, args);
  }
}

我已經使用 Spring JPA 進行了數據訪問

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.show-sql=true

我為 Account 表設置了一個 JPA 存儲庫:

public interface AccountRepository extends JpaRepository<Account, Long> {

    List<Account> findByNameStartsWithIgnoreCase(String name);
}

在我的 MainView 中, AccountRepository沒有被 Spring 框架@Autowired

我可以通過構造函數注入獲得它的一個實例:

public MainView(AccountRepository accountRepository) {
}

但是如果我嘗試使用自動裝配構造函數輸出'null'

@Route
@Configurable
@PageTitle("Basic App Layout")
@CssImport(value = "combobox-styles.css", themeFor="vaadin-combo-box-overlay")
public class MainView extends AppLayout {
    
    @Autowired
    AccountRepository accountRepository;
    
    public MainView() {
        
        System.out.println(accountRepository);
    }
}

這是因為代碼是從 MainView 構造函數中調用的嗎? 我們如何將Autowired JPA bean 與 Vaadin 一起使用?

編輯:我已將@EnableJpaRepositories 添加到應用程序,但自動裝配仍然失敗

@SpringBootApplication
@EnableJpaRepositories(basePackages= {"org.mypackage.tax.repo"})
public class TaxApplication {

這就是 Spring 中的自動裝配的工作原理。

當您使用構造函數注入時,只要只有一個構造函數,您就可以省略@Autowired注釋,但它仍然是自動裝配的。

當您使用字段或設置器時,將在構建 bean 后注入依賴項。 這與 Vaadin 無關。

構造函數注入通常優於字段注入。 它使 class 更易於測試,因為您可以在自己實例化它時輕松地將模擬或存根傳遞給構造函數。

您可以嘗試將@EnableJpaRepositories注釋添加到您的TaxApplication class

將此添加到您的應用程序TaxApplication

@EnableJpaRepositories(basePackages= {"com.tax.persistence"})

com.tax.persistence是包含您的存儲庫的 package。

您也可以使用@Component注釋MainView以使其成為 Spring bean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM