構成で「パッケージ」タイプのBeanを定義することを検討してください[Spring-Boot]


108

次のエラーが発生します。

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.


Action:

Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.

これまでにこのエラーを見たことがありませんが、@ Autowireが機能していないのは奇妙です。プロジェクトの構造は次のとおりです。

申請者インターフェース

public interface Applicant {

    TApplicant findBySSN(String ssn) throws ServletException;

    void deleteByssn(String ssn) throws ServletException;

    void createApplicant(TApplicant tApplicant) throws ServletException;

    void updateApplicant(TApplicant tApplicant) throws ServletException;

    List<TApplicant> getAllApplicants() throws ServletException;
}

ApplicantImpl

@Service
@Transactional
public class ApplicantImpl implements Applicant {

private static Log log = LogFactory.getLog(ApplicantImpl.class);

    private TApplicantRepository applicantRepo;

@Override
    public List<TApplicant> getAllApplicants() throws ServletException {

        List<TApplicant> applicantList = applicantRepo.findAll();

        return applicantList;
    }
}

これで、Autowire申請者だけにアクセスしてアクセスできるはずですが、この場合、自分で呼び出すと機能しません。 @RestController:

@RestController
public class RequestController extends LoggingAware {

    private Applicant applicant;

    @Autowired
    public void setApplicant(Applicant applicant){
        this.applicant = applicant;
    }

    @RequestMapping(value="/", method = RequestMethod.GET)
    public String helloWorld() {

        try {
            List<TApplicant> applicantList = applicant.getAllApplicants();

            for (TApplicant tApplicant : applicantList){
                System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
            }

            return "home";
        }
        catch (ServletException e) {
            e.printStackTrace();
        }

        return "error";
    }

}

------------------------ UPDATE 1 -----------------------

追加した

@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

エラーはなくなりましたが、何も起こりませんでした。ただし、追加ApplicantするRestController前にすべての処理をコメント化し@ComponentScan()たところ、文字列を返すことができたためUIRestController動作していたため、スキップされます。私はWhitelabel Error Page今醜いです。

---------------------更新2 --------------------------- ---

不満だった豆のベースパッケージを追加しました。エラー読み取り:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.


Action:

Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.

追加した @ComponentScan

@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

----------------------------更新3 -------------------- -

追加:

@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {

それでも私のレポに私のApplicantImplクラスについて文句を言っています。@AutowiresTApplicantRepository


アプリケーションコンテキストファイルはどこにありますか?持っていない場合は、@ ComponentScanなどのアノテーションを使用してSpringにヒントを与え、すべてのBeanを使用できるようにすることを検討してください。
Mario Santini、

@MarioSantiniは、更新1を参照してください
Mike3355

各更新後にエラーに変更があったと思いますか?可能であれば、プロジェクト構造と、それぞれの場合のエラーログ/スタックトレースを投稿してください。「何か」がエラーを解消するのではなく、「なぜ」これらのエラーが発生したのかを知る方が良いでしょう。同様の問題に遭遇した他の人にも役立ちます。
Ameen.M 2016年

回答:


201

プロジェクトが複数のモジュールに分割されている可能性があります。

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {

5
涼しい。私のプロジェクトはいくつかのモジュールで分割されています。ComponentScanは私の問題を解決しました!
kholofelo Maloma 2017年

ComponentScanアノテーションは私の問題を解決しますが、@ EnableAutoConfigurationは解決しません
jpl

実際、EnableAutoConfigurationは特定のアイテムのベース「検索パッケージ」を暗黙的に定義し、ルートパッケージを使用すると、basePackage属性を指定せずにComponentScanアノテーションを使用することもできます。また、メインクラスがルートパッケージにある場合、@ SpringBootApplicationアノテーションを使用できます
jpl

1
この解決策は、バージョン2.0.4のこのエラーで私を助けました
manu muraleedharan

2
はい、プロジェクトがさまざまなモジュールに分割されているためです。@EntityScanそして@EnableJpaRepositories右のパッケージ名と私のために働きました。
Adi Sivasankaran、2018年

51


可能性があります...それぞれの実装クラスで@Service@Repositoryアノテーションが欠落している可能性があります。


2
これは、受け入れられた答えであり、単純で要点を修正する必要があります。ありがとうございました。
ナイトフューリー

1
私のために働いた。ありがとう。
Okafor T Kosiso

1
ありがとう、@ Repositoryアノテーションがありませんでした
sergodeeva

1
ええ、これが答えになるはずです。上記の回答は、スキャンが失敗したことを単に想定していますが、これは誤りです。
Sumit Badsara

48

申請者クラスがスキャンされていないようです。デフォルトでは、配置したクラスとしてルートから始まるすべてのパッケージ@SpringBootApplicationがスキャンされます。

mainクラス「WebServiceApplication」が「」にあるとすると、「com.service.something」に該当するすべてのコンポーネントcom.service.somethingがスキャンされ、「」はスキャンされcom.service.applicantません。

「WebServiceApplication」がルートパッケージに分類され、他のすべてのコンポーネントがそのルートパッケージの一部になるように、パッケージを再構築できます。または@SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})、「ALL」コンポーネントをスキャンしてSpringコンテナで初期化するなどを含めることができます。

コメントに基づいて更新

maven / gradleによって管理されている複数のモジュールがある場合、すべての春のニーズはスキャンするパッケージです。Springに「com.module1」をスキャンするように指示し、ルートパッケージ名が「com.module2」である別のモジュールがある場合、これらのコンポーネントはスキャンされません。Springに「com」をスキャンするように指示することもできますこれにより、「com.module1.」と「com.module2.」内のすべてのコンポーネントがスキャンされます


私のプロジェクトは、構造が異なるモジュールです。たとえば、サービスには独自のモジュールとがありbuild.gradleます。それらのbuild.gradleモジュール名はdependencies、mainメソッドでモジュールのに追加されます。したがって、あなたが見@ComponentScan("module-service")たとき、それは私がうまくいくと思っていたものです。ただし、内部にmodule-serviceは1つのパッケージがあります。だから私の質問はそれはどのように見えるでしょうか?パッケージ名、モジュール名、またはその両方に名前を付けますか?
Mike3355 2016年

パッケージが異なるモジュールに分類されるかどうかは関係ありません。コンポーネントをスキャンする必要があるパッケージは、春になるように指定する必要があります。「scanBasePackages」属性で、すべてのモジュールのすべての「ルート」パッケージ名を指定できます。そして、言及されているすべての「パッケージ」であり、モジュールではありません。
Ameen.M 2016年

あなたが言ったことをやりました、そしてエラーは消えましたが、さらに別のパッケージについて不平を言うだけでした。当然リストに追加しましたが消えません。私はそれを次のように実装しました:@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
Mike3355

私はちょうどそれをやった@SpringBootApplication(scanBasePackages= "com")、そしてそれはJPAリポジトリについて不平を言っている。どうもありがとうございました。上記を実行すると、「com」で始まるすべてのパッケージがSpringによってスキャンされることは知りませんでした。
Mike3355 2016年

23

基本的に、これは「別のパッケージ」にクラスアプリケーションがある場合に発生します。例えば:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

これで問題をApplication.classで解決します

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

もう1つのエレガントでない方法は、すべての構成クラスを同じパッケージに入れることです。


2
実際、@ComponentScan上記のシナリオでは指定する必要はありません。あなたのApplication.class@SpringBootApplicationアノテーションを持っている)com.serverはとにかくとの両方のルートであるに配置さcom.server.configれているためcom.server.repositoryです。
Ameen.M 2017

@ Ameen.MTそれは私の正確な質問です、なぜそれがまだ解決できないの@EnableMongoRepositoriesですか?
Karthikeyan

10

私の場合、ひどい間違いがありました。@Serviceサービスのインターフェースに我慢。

それを修正するために、@Serviceサービスファイルの実装を行いました。


わたしも。ありがとう
マンタ

7

Beanが@Autowiredと同じパッケージにある場合、そのような問題は発生しません。ただし、デフォルトでは、Beanは別のパッケージからアクセスできません。この問題修正するには、次の手順に従います。

  1. メインクラスに以下をインポートします
    。import org.springframework.context.annotation.ComponentScan;
  2. メインクラスに注釈を追加します。
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

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

5

@Repositoryを使用してリポジトリに注釈を付けることでそれを簡略化できると思います。その後、Spring Frameworkによって自動的に有効になります。


4

私の場合、これらの2つのオプションが機能しました。

  1. 中に//@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) 含ま保持しているパッケージApplication.classのリストに、または

  2. 追加するだけ@EnableAutoConfigurationです。すべての春の豆を自動的に認識します。


3

これは、Lombokを使用してい@RequiredArgsConstructor@NonNull、フィールドにandを追加したが、一部のフィールドがコンストラクターに注入されない場合にも発生する可能性があります。これは、同じエラーが発生する可能性の1つにすぎません。

パラメータ0には、見つからないタイプMissingBeanNameのBeanが必要でした

私の場合、エラー@NonNullはアプリケーションを削除した後、問題が発生したコントローラを教えてくれました


3

Spring Boot 2を使用したMavenマルチモジュールプロジェクトでよくある問題に直面しました。この問題は、サブMavenモジュールでのパッケージの命名に関連しています。

@SpringBootApplicationは、@ ComponentScan、@ EnableAutoConfiguration、jpa-repositories、json-serializationなどの多くのコンポーネントをカプセル化します。そして、@ ComponentScanをcom。*******。spaceパッケージに配置します。パッケージcom。*******。spaceのこの部分は、すべてのモジュールに共通である必要があります。

それを修正するために:

  1. すべてのモジュールパッケージの名前を変更する必要があります。つまり、すべてのMavenモジュールのすべてのパッケージに含まれている必要があります-同じ親パーツ。例-com。*******。space
  2. また、エントリポイントをこのパッケージに移動する必要があります-com。*******。space

2

私はオンラインで答えを探しましたが、私の場合、適切な解決策は1つもないようです。最初は、すべてが次のようにうまく機能します。

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

それから私は何かをキャッシュするためにマップを追加しようとしています、そしてそれはこれになります:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

ブーム!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

私は削除@AllArgsConstructor(onConstructor = @__(@Autowired))して追加し@Autowired、それぞれのためにrepositoryしてservice除きますMap<String, String>。以前と同じように機能します。

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

これがお役に立てば幸いです。


2

アプリケーションに以下の注釈を追加した後、それは私のために働きました:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

次のエラーが発生しました:

「コンストラクターのパラメーター1には、見つからないタイプマッパーのBeanが必要でした:



2

2つの異なるクラスで同じBeanを誤って定義した場合にも、このエラーが発生します。それは私に起こりました。エラーメッセージは誤解を招くものでした。余分なBeanを削除すると、問題は解決しました。


1
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

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

1

これは、@ Serviceクラスが抽象としてマークされている場合に発生する可能性があります。


1

クラスの依存関係がSpringによって管理されている場合、POJOクラス内にdefault / empty argコンストラクターを追加するのを忘れると、この問題が発生する可能性があります。


1

それは誰かを助けるかもしれません。私は同じ問題、同じエラーメッセージ、同じすべてを抱えていました。私は他の回答から解決策を試してみましたが、使用しているBeanが実際に自動配線されたものと同じ名前であることを理解するまで助けにはなりませんでした。リファクタリングの最中に起こったので、クラスの名前を変更する必要がありました。乾杯


1

私は同じ問題に直面しました。Mongo DBリポジトリはSpringブートによって識別されましたが、mongoリポジトリを拡張するリポジトリインターフェース用のBeanを作成していませんでした。

私の場合の問題は、「春+マンゴー」のmaven pomでのバージョン指定の誤りでした。アーティファクトのグループIDを変更しましたが、すべて魔法のように機能しました。Spring Bootがすべてを処理するため、注釈は必要ありません。

私が問題を解決している間、私は解決策を探し求めていましたが、この問題は実際にはプロジェクト構成に関連していることに気付きました。プロセスの正確な場所で、作成は失敗しました。


0

私の場合、このエラーは、インポートが間違っていたために表示されます。たとえば、Springを使用すると、インポートが自動的に表示されます。

import org.jvnet.hk2.annotations.Service;

しかし私は必要でした:

import org.springframework.stereotype.Service;

0

RestTemplateをサービスクラスに挿入する必要がある場合がありました。ただし、RestTemplateはサービスクラスで取得できません。私がしたことは、メインアプリケーションと同じパッケージの下にラッパークラスを作成し、ラッパーをコンポーネントとしてマークし、サービスクラスでこのコンポーネントを自動配線することです。問題が解決しました。それもあなたのために働くことを願っています


0

私のエラーは私が含めていたということでした:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

の代わりに:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

0

RequestControllerに@Beanアノテーションがないと思います

ファイルにBeanを追加します。これにより問題が解決
しました。チュートリアルポイントからSpring Bootを学習しているときにこの解決策を得ました

private Applicant applicant;

@Bean 
public Applicant applicant() { 
    return new Applicant(); 
}

0

Spring Boot Data JPA Starter依存関係を追加すると、問題が解決しました。

メイベン

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'

または、ここに直接行くこともできます


この場合、これは実際には適用されません。データベースへの接続の詳細を要求します(DataSourceの構成に失敗しました: 'url'属性が指定されておらず、埋め込みデータソースを構成できませんでした。)。データベースを操作せずに手動でテストしたい状況では、これは機能しません。
トーマスOkonkwo

0

使用するinterface場合はCrudRepository<Applicant,Long>@Repositoryアノテーションで拡張できます。


0

例ごとに使用した場合にも問題が発生する可能性があります @EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)、後でパッケージ名を変更したり、別の場所に移動したり。

非常に多くの場合、マルチモジュールのmavenプロジェクトとスプリングブートで直面していました


0

インターフェイスを実装する前に、インターフェイス@autowiredしようとしている可能性があります。

ソリューションの例:

    **HomeController.java**
    class HomeController{

      @Autowired
      UserService userService;
    .....
    }
----------------------------------------------------------------------
    **UserService.java** 
    public interface UserService {
        User findByUsername(String username);
    .....
    }
-----------------------------------------------------------------------
     **UserServiceImpl.java**
     @Service
     public class UserServiceImpl implements UserService{

         public User findByUsername(String username) {
           return userDao.findByUsername(username);
         }
        ....
      }

<i>This is not italic</i>, and [this is not a link](https://example.com)


0

以下に示すように、プロジェクト構造を構成してみてください。

すべてのリポジトリ、サービス、パッケージをメインパッケージの子パッケージに配置します。

package com.leisure.moviemax;  //Parent package
        
@SpringBootApplication
@PropertySource(value={"classpath:conf.properties"})
    
public class MoviemaxApplication implements CommandLineRunner {
        
package com.leisure.moviemax.repo; //child package

@Repository
public interface UsrRepository extends JpaRepository<UserEntity,String> {

0

Springは世界をスキャンしないことを思い出してください。Springbootapplicationが格納されているパッケージの下のすべてを意味するターゲットスキャンを使用します。したがって、別のspringbootapplicationパッケージにサービスインターフェイスがあるため、「構成[Spring-Boot]でタイプ 'パッケージ'のBeanを定義することを検討してください」というエラーが表示される場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.