2017-07-30 11 views
1

私は Stephan Zerhusen's excellent SpringBoot + JWTのデモに基づいてプロジェクトを開始しています。 SpringToolSuiteプロジェクトにインストールされて正常に動作します。私のそれ以上の発展は問題に走っています。スプリングブート - なぜ@ComponentScanはパッケージの組み合わせで動作しないのですか?

Stephanのコード(org.zerhusen)を私のビジネスロジック(com.mypackage)から分離したいと思います。 @SpringBootApplicationと@ComponentScanの試した設定は私のために働いていません。

SpringBootスタートアッププログラムは次のとおりです。

package org.zerhusen; 
[SNIP] 

@SpringBootApplication 
public class JwtDemoApplication { 

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

私は単に私が見プログラムを再度com.mypackageして実行するorg.zerhusenからパッケージを変更した場合:

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を使用していますので、インターフェイスは単にUserDetailsS​​ervice実装の実装内で参照されている(私は後でJPAとMySQLを取得します):

に私に言ってstackoverflowの記事がたくさんあります
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] 
} 

それのどれも私にとっては役に立ちません。

私はすべてを1つのパッケージツリーに強制したくありません。ステファンのコードをどのように書き直すことなく、私のコードをどのように融合できますか? - しかし私の設定は私のプログラムが動かないようにしています。

誰かが私の状況に対して正しい設定を教えてもらえますか?

ありがとう、 Jerome。私はクラスを使用して、@EnableJpaRepositoriesステートメントを変更し、コメントを使用して

UPDATE 7/30 ON、12:04 CDT 。その変更により、アプリケーションは適切に動作します。念頭に置いて

私は、一度に1つの注釈をコメントアウトし、バリエーションを試してみました:

  • @SpringBootApplicationなければ春ブートコンテナが起動しません。
  • @ComponentScanを指定しないと、アプリケーションが起動します。基本認証のようなユーザー名/パスワードのポップアップがありますが、それは実際には機能しません。
  • @EnableJpaRepositoriesなしUserRepositoryについて質問しました
  • @EntityScanを使用しない場合、Spring BootはTomcatを起動しません。

私はこの成功(すべてのレスポンダーのおかげで働くアプリケーション)を受け取りますが、これらの4つの注釈が必要な理由をまだ理解していません。

+0

'@EnableJpaRepositories(basePackages = {" org.zerhusen.security.repository "})'を使って試してみましょう。 –

答えて

3

問題がにクラス名代わりのパッケージ名を指定--youあなた@EnableJpaRepositoriesです。引数を完全に削除してください(実際には、@SpringBootApplication - @ComponentScanが含まれていますが、すべてを削除できるはずです)。

一般に、Bootのデフォルトは良い汎用的な妥協策です。したがって、デフォルトとの実際の衝突がない限り、明示的に指定を開始しないでください。で

2

@EnableJpaRepositoriesあなたはbasePackagesClass代わりbasePackagesの使用またはあなたがbasePackagesを維持することを好む場合org.zerhusen.security.repositoryを設定することができます。

関連する問題