2017-07-30 70 views
1

我正在啓動一個基於 Stephan Zerhusen's excellent SpringBoot + JWT演示的項目。它在我的SpringToolSuite項目中安裝並運行良好。我的進一步發展遇到了問題。Spring Boot - 爲什麼@ComponentScan不能使用我的軟件包組合?

我想從業務邏輯(com.mypackage)中分離出Stephan的代碼(org.zerhusen)。沒有配置我試過@SpringBootApplication和@ComponentScan已經爲我工作。

的SpringBoot啓動程序是:

package org.zerhusen; 
[SNIP] 

@SpringBootApplication 
public class JwtDemoApplication { 

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

如果我僅僅是從包改變org.zerhusen到com.mypackage並再次運行程序我看到:

APPLICATION FAILED TO START 
*************************** 
Description: 
Field userRepository in org.zerhusen.security.service.JwtUserDetailsServiceImpl required a bean of type 'org.zerhusen.security.repository.UserRepository' that could not be found. 

Action: 
Consider defining a bean of type 'org.zerhusen.security.repository.UserRepository' in your configuration. 

現在UserRepository只是一個接口:

package org.zerhusen.security.repository; 
[SNIP] 

public interface UserRepository extends JpaRepository<User, Long> { 
    User findByUsername(String username); 
} 

但該接口不是由用戶代碼實現的。而且因爲我只在這一點上使用H2(我會得到JPA和MySQL版本)的接口的UserDetailsS​​ervice實現的實現中只是引用:

package org.zerhusen.security.service; 
[SNIP] 

@Service 
public class JwtUserDetailsServiceImpl implements UserDetailsService { 

    @Autowired 
    private UserRepository userRepository; 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    [SNIP] 
} 

有很多計算器文章告訴我使用配置,但我已經有:

@SpringBootApplication(scanBasePackages = {"org.zerhusen"}) 
@ComponentScan(basePackages = {"org.zerhusen"}) 
@EnableJpaRepositories(basePackages = {"org.zerhusen.security.repository.UserRepository"}) 
@EntityScan(basePackages = {"org.zerhusen"}) 
public class JwtDemoApplication { 
[SNIP] 
} 

而且這些都不適合我。

我不想強迫所有事情都變成一個包樹 - 我如何將Stephan's的代碼與我的代碼融合在一起,而不必重寫他的? - 但我的配置沒有讓我的程序運行。

有人可以給我一個正確的配置,我的情況?

謝謝, 傑羅姆。

UPDATE ON 7/30,12:04 CDT 使用註釋我改變了@EnableJpaRepositories語句,只使用了類。隨着這種改變,應用程序正常工作。

考慮到這一點我想變化,同時註釋掉一個註解:

  • 沒有@SpringBootApplication春節引導容器不啓動。
  • 沒有@ComponentScan應用程序啓動。它有一個像基本認證一樣的用戶名/密碼彈出窗口,但實際上並不工作。
  • 沒有@EnableJpaRepositories我被問到UserRepository
  • 沒有@EntityScan Spring Boot不會啓動Tomcat。

我會取得這個成功(一個感謝所有響應者的工作應用程序),但還不明白爲什麼需要這四個註釋。

+0

假設您使用'@EnableJpaRepositories(basePackages = {「org.zerhusen.security.repository」})'並嘗試。 –

回答

3

的問題是在你@EnableJpaRepositories - 您指定類名而不是包名。只要完全放棄論點(事實上,你應該能夠消除一切,但包括@SpringBootApplication - @ComponentScan)。

作爲一項規則,Boot的默認設置是一個很好的通用折衷辦法,所以除非您與默認實際發生衝突,否則不要開始明確指定。

2

在你@EnableJpaRepositories您可以使用basePackagesClass代替basePackages或設置org.zerhusen.security.repository如果你喜歡保持basePackages

相關問題