「フィールドには、見つからなかったタイプのBeanが必要でした。」mongodbを使用したエラースプリングRESTfulAPI


101

だから私はこのチュートリアルに従って、数週間で春を学んでいます

RESTfulWebサービスの構築

それをmongodbに統合しようとするまで、すべてが順調でした。だから私はこのチュートリアルに従います。

MongoDBを使用したデータへのアクセス

しかし、私の練習は部分的にまだ最初のものを使用しています。だから私のプロジェクトのディレクトリ構造はこんな感じです。

src/
├── main/
│   └── java/
|       ├── model/
|       |   └── User.java
|       ├── rest/
|       |   ├── Application.java
|       |   ├── IndexController.java
|       |   └── UsersController.java
|       └── service/
|           └── UserService.java
└── resources/
    └── application.properties

これは私のmodel / User.javaファイルです

package main.java.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="user")
public class User {

    private int age;
    private String country; 
    @Id
    private String id;
    private String name;


    public User() {
        super();
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}

これは私のrest / UsersController.javaファイルです

package main.java.rest;

import java.util.List;
import main.java.service.UserService;
import main.java.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/users")
public class UsersController {

    @Autowired
    UserService userService;

    @RequestMapping(method = RequestMethod.GET)
    public List<User> getAllUsers() {
        return userService.findAll();
    }
}

これは私のservice / UserService.javaファイルです

package main.java.service;

import java.util.List;
import main.java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserService extends MongoRepository<User, String> {
    public List<User> findAll();
}

それらをコンパイルすることはできましたが(チュートリアルに従っているため、コンパイルにgradleを使用しています)、jarファイルを実行するとこのエラーがスローされていました。


アプリケーションを開始できませんでした


説明:

main.java.rest.UsersControllerのフィールドuserServiceには、タイプ 'main.java.service.UserService'のBeanが必要でしたが、見つかりませんでした。

アクション:

構成でタイプ 'main.java.service.UserService'のBeanを定義することを検討してください。

何が問題なのかわからないので、グーグルを始めて、Beans.xmlファイルをインクルードしてuserServiceを登録する必要があることがわかりました。私はそれをしましたが、それは機能していません。私はこれに本当に慣れていないので、何が起こっているのか全くわかりません。

回答:


159

それを解決しました。したがって、デフォルトでは、@SpringBootApplication宣言に該当するすべてのパッケージがスキャンされます。

宣言があるメインクラスが内部で宣言されExampleApplicationているとすると、該当するすべてのコンポーネントはスキャンされますが、スキャンされません。@SpringBootApplicationcom.example.somethingcom.example.somethingcom.example.applicant

したがって、この質問に基づいてそれを行うには2つの方法があります。使用する

@SpringBootApplication(scanBasePackages={
"com.example.something", "com.example.application"})

そうすれば、アプリケーションは指定されたすべてのコンポーネントをスキャンしますが、スケールが大きくなった場合はどうなるでしょうか。

したがって、パッケージを再構築するという2番目のアプローチを使用すると、機能しました。今、私のパッケージ構造はこのようになりました。

src/
├── main/
│   └── java/
|       ├── com.example/
|       |   └── Application.java
|       ├── com.example.model/
|       |   └── User.java
|       ├── com.example.controller/
|       |   ├── IndexController.java
|       |   └── UsersController.java
|       └── com.example.service/
|           └── UserService.java
└── resources/
    └── application.properties

実際には何も変わっていません。パッケージとクラスの名前を@GuoJingに変更しました
Eka Rudianto 2017

@ekaRudiantoタイプミスがあります。オープニングいいえ{scanBasePackages= "com.example.something","com.example.application"
BRK

私も同じ問題を抱えていて、パッケージ構造が適切な順序になっていないことがわかりました。私はそれらをこのように再配置しました、そしてそれは今うまく働いています。
VimukthiSineth19年


20

私も同じエラーがありました:

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

Description:

Field repository in com.kalsym.next.gen.campaign.controller.CampaignController required a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' that could not be found.


Action:

Consider defining a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' in your configuration.de here

そして、私のパッケージは、受け入れられた回答で述べられているのと同じ方法で構築されました。次のようにメインクラスにEnableMongoRepositoriesアノテーションを追加して、問題を修正しました。

@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {

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

複数を追加する必要がある場合は、中括弧を忘れないでください。

@EnableMongoRepositories(basePackageClasses
    = {
        MSASMSRepository.class, APartyMappingRepository.class
    })

14

同じ問題が発生し、アプリケーションをサービス、dao、およびドメインパッケージよりも1レベル上のパッケージに配置するだけで済みました。


12

このスレッドは現在古いですが、他の人に役立つかもしれない私の答えを投稿しています。

私も同じ問題を抱えていました。他のモジュールに同じ名前の別のクラスがあることが判明しました。そのクラスの名前を変更すると、問題が解決しました。


10

自動インポートのために多くの時間を費やしました。Intellij Ideaがなぜ代わりにインポートさ@Serviceimport org.jvnet.hk2.annotations.Service;たのかimport org.springframework.stereotype.Service;


あなたの答えを更新し、あなたがしていることを説明していただけませんか。事前に感謝します
MZaragoza 2017

3
私の答えから何がわからなかったのですか?プロジェクトを実行しようとすると、質問と同じエラーが発生しました。Service間違ったライブラリからインポートしたためです。
Vitali Kuzmin 2017

@VitaliKuzminはまだあなたの答えに明確さはありません。あなたの答えは正しいかもしれませんし、それはあなたのために働いたかもしれませんが、あなたがここに提示した方法は混乱し、読者に優しいものではありません
mannedear 2018年

3
@mannedear私の最初のコメントもあなたのコメントに答えると思います。
Vitali Kuzmin 2018年

私もインポートエラーを犯したので、この答えを+1しました!:0 私のモデルimport javax.persistence.Table;import org.springframework.data.relational.core.mapping.Table;はなく。smhは、このBeanエラーのデバッグで5時間を失いました。
kalpaj agrawalla




3

daoクラス@Repositoryを追加します

例:

@Repository
public class DaoClassName implements IIntefaceDao {
}

2

すべての@アノテーションを使用すると、問題が修正されました。(はい、Springは初めてです)サービスクラスを使用している場合は、@ Serviceを追加し、@ Controllerと@Repositoryについても同じです。

次に、App.javaのこの注釈により、問題が修正されました(JPA + Hibernateを使用しています)

@SpringBootApplication
@EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })
@ComponentScan(basePackages = {"es.unileon.inso2"})
@EntityScan("es.unileon.inso2.model")
@EnableJpaRepositories("es.unileon.inso2.repository")

パッケージツリー:

src/
├── main/
│   └── java/
|       ├── es.unileon.inso2/
|       |   └── App.java
|       ├── es.unileon.inso2.model/
|       |   └── User.java
|       ├── es.unileon.inso2.controller/
|       |   ├── IndexController.java
|       |   └── UserController.java
|       ├── es.unileon.inso2.service/
|       |    └── UserService.java
|       └── es.unileon.inso2.repository/
|            └── UserRepository.java
└── resources/
    └── application.properties

2

@EnableMongoRepositories( "in.topthree.util")を追加することで修正された、同じ問題があります

package in.topthree.core;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import in.topthree.util.Student;

@SpringBootApplication
@EnableMongoRepositories("in.topthree.util")
public class Run implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Run.class, args);
        System.out.println("Run");
    }

    @Autowired
    private Process pr;

    @Override
    public void run(String... args) throws Exception {
        pr.saveDB(new Student("Testing", "FB"));
        System.exit(0);
    }

}

そして私のリポジトリは:

package in.topthree.util;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface StudentMongo extends MongoRepository<Student, Integer> {

    public Student findByUrl(String url);
}

今その動作


1

ターゲットフォルダー内のマッパー実装クラスが削除されたため、マッパーインターフェイスに実装クラスがなくなりました。したがって、私は同じエラーを受け取りましたField *** required a bean of type ***Mapper that could not be found.

Mavenを使用してマッパーの実装を再生成し、プロジェクトを更新するだけで済みました...


1

私はこの投稿に来て、MongoリポジトリでSpringWebfluxを使用しているときに助けを求めています。

私のエラーは所有者に似ていました

Field usersRepository in foobar.UsersService required
a bean of type 'foobar.UsersRepository' that could not be found.

以前SpringMVCで作業していたので、このエラーに驚いていました。

ヘルプを見つけることはそれほど明白ではなかったので、それが何らかの形で関連していて、この質問が検索結果で高いので、私はこの質問に答えを置いています。

まず、承認済みとしてマークされた回答で言及された内容、つまりパッケージ階層について覚えておく必要があります。

2つ目の重要な点は、Webfluxを使用する場合は別のパッケージを使用する必要がある一方で、Spring MVCを使用する場合(MongoDBなど)は追加する必要があることです。

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

-反応性終わり。


1

私も同じ問題を抱えていました。私の間違いは、サービスインターフェイスで@Serviceアノテーションを使用したことです。@ServiceアノテーションはServiceImplクラスに適用する必要があります。


1

daoクラスに@Repositoryを追加します

    @Repository
    public interface UserDao extends CrudRepository<User, Long> {
         User findByUsername(String username);
         User findByEmail(String email);    
      }

CrudRepositoryをすでに拡張している場合は@Repositoryを追加する必要はありません
Karen Goh

1

コントローラから@AutowiredAnnotationを削除したのと同じ問題が発生しました。リポジトリがクラスの場合、リポジトリを使用するにはAutowired Annotationが必要ですが、それがインターフェイスの場合は、私の経験から@AutowiredAnnotationを追加する必要はありません。


0

これは、2つのBeanが同じ名前の場合に発生する可能性があります。

Module1Beans.java

@Configuration
public class Module1Beans {
    @Bean
    public GoogleAPI retrofitService(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.google.com/")
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        return retrofit.create(GoogleAPI.class);
    }
}

Module2Beans.java

@Configuration
public class Module2Beans {
    @Bean
    public GithubAPI retrofitService(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.github.com/")
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        return retrofit.create(GithubAPI.class);
    }
}

名前付きのBeanretrofitServiceが最初に作成され、そのタイプはですGoogleAPI。その後、GithubAPI両方ともretrofitService()メソッドによって作成されるため、カバーされます。これで、次@AutowiredGoogleAPIようなメッセージが表示されます。Field googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.


0

私の場合、クラスMyprojectApplicationを同じレベルのモデル、コントローラー、サービスパッケージのパッケージ(com.example.start)に配置しました。


0

古いことは知っていますが、5セント追加したいと思います。

私が使用.serviceして.service.implフォルダ構造での実装とサービスを分離すること。ServiceImplementationピースの実装を忘れてください。


0

Spring Bootを使用する場合は、依存関係としてspring-boot-starter-data-jpaをインポートする必要があります


0

Beanを作成して注入するために、クラスは、コンテキスト内のコンテキストに応じて、@ Componet、@ service、@ Repositoryなどでマークする必要があります。

package main.java.service;

import java.util.List;
import main.java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
@Repository
public interface UserService extends MongoRepository<User, String> {
    public List<User> findAll();
}

0

私にとってこのメッセージ:

org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor 'public org.package.MyClass(org.apache.wicket.request.mapper.parameter.PageParameters)' and argument ''. Might be it doesn't exist, may be it is not visible (public).

「上部のウィケットユニットテストでは、そのBeanを手動で追加する必要があります」という意味です。

appContext.putBean(myClass);

0

私はここでOPが続くすべての手順と指示に従い、ユーザー名とパスワードの周りの空白を処理しました(Springはプロパティファイルの空白を処理しますが)、まだどちらかが直面していました

could not find bean for ___Repository

(JPARepositoryを拡張するインターフェース)

または@EnableJPARepositoryを追加した後

could not find bean for EntityManagerFactory

pom.xmlでSpringBootStarterの親バージョンを2.3.2から2.2.1に変更することで解決しました

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

次の依存関係を追加します

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

私は以下のいずれかを追加する必要はありませんでした、スプリングブーツはそれ自体を行います

  1. @ EnableJPAReposity-私はすでに同じルートパッケージを持つすべてのクラスを持っていたので
  2. application.propertiesのspring.data.jpa.repositories.enabled
  3. アプリケーションプロパティのspring.datasource.driverClassName = com.mysql.jdbc.Driver

0

一般的なBeanエラーメッセージをグーグルで検索してここに来たが、実際にSpringBootアプリケーションに偽のクライアントを追加しようとしている人は@FeignClientクライアントインターフェイスのアノテーションを、上記の解決策はどれもうまくいきません。

この問題を修正するには@EnableFeignClients、次のように、Applicationクラスにアノテーションを追加する必要があります。

@SpringBootApplication
// ... (other pre-existing annotations) ...
@EnableFeignClients // <------- THE IMPORTANT ONE
public class Application {

このように、修正は上記の修正と同様@EnableMongoRepositoriesです。この一般的なエラーメッセージがあらゆるタイプの状況に合わせた修正を必要とするのは残念です...


0

2種類のmongo依存関係-

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

2種類のリポジトリ-

MongoRepository
ReactiveMongoRepository

正しい組み合わせを使用していることを確認してください。


-1

これを使用して私の問題を解決しました。

@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.