web-dev-qa-db-ja.com

'フィールドに見つからないタイプのBeanが必要です。' mongodbを使用したエラーSpring Restful API

それで、私は数週間のうちにSpringを学びました、このチュートリアルに続いていました

RESTful Webサービスを構築する

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

MongoDBでデータにアクセスする

しかし、私のやり方は部分的にまだ最初のものを使っています。だから私のプロジェクトのディレクトリ構造はこのようなものです。

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

これは私の model/User.Java fileです。

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 fileです。

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 fileです。

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を定義することを検討してください。

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

57
Eka Rudianto

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

@SpringBootApplication宣言を持つ私のメインクラスExampleApplicationcom.example.something内で宣言されていると仮定すると、com.example.somethingに該当するすべてのコンポーネントがスキャンされますが、com.example.applicantはスキャンされません。

それで、これに基づいてそれをする2つの方法があります question 。つかいます

@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
89
Eka Rudianto

Service/UserService.Javaに@Serviceを追加します。

43
dzzxjl

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

***************************
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);
    }
}
12
shabby

私は同じ問題に遭遇しました、そして私がしなければならなかったすべてはサービス、daoとドメインパッケージより1つ上のレベルのパッケージにアプリケーションを配置することでした。

8
Akash Yellappa

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

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

6

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

5
Vitali Kuzmin

通常、この問題を解決するには2つの側面があります。

  1. Spring Bootbeanをスキャンするために、@Componentのように適切なアノテーションを使用する必要があります。
  2. scanningパスには、他のすべてのクラスと同じようにクラスが含まれます。

ちなみに、 @ Component、@ Repository、@ Service、および@Controller の違いについては、非常に良い説明があります。

2
Hearen

コントローラクラスに@Componentを追加します。この作品は

2
shubham bansal

Mongo RepositoryでSpring Webfluxを使用している間私は助けを探してこの記事に来ました。

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

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

私が以前Spring MVCで働いていたとき、このエラーに驚きました。

ヘルプを見つけるのはそれほど明白ではなかったので、どういうわけかこの質問に対する答えを出しています。この質問は検索結果で高いです。

最初に、答えとして受け入れられたとマークされたもの - パッケージ階層について覚えておく必要があります。

2つ目の重要なことは、もしあなたがWebfluxを使うのであれば、Spring MVCを使っている間は別のパッケージを使う必要があるということです。 MongoDBの場合は追加する必要があります

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

末尾に -reactive を付けます。

0

すべての@注釈を使用して私の問題を解決しました。 (はい、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
0
Kashmir54

@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);
}

今ではその作業

0
Ahmad

私の場合、コピー&ペーストをしている間に誤ってサービスクラスabstractを定義しました。

@Serivce
@Valdiated
public abstract class MyService { // remove the abstract modifier!!!
}
0
Jin Kwon

サービスの実装に@Service注釈を追加する必要があります。

0
Ahmed AMMOURI

私のターゲットフォルダの私のMapper実装クラスは削除されていたので、私のMapperインターフェースはもう実装クラスを持っていませんでした。したがって、私は同じエラーを得ましたField *** required a bean of type ***Mapper that could not be found.

私は単にmavenを使ってマッパーの実装を再生成し、プロジェクトを更新しなければなりませんでした...

0
RotS

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

0
Zain Elabidine