1. ホーム
  2. java

[解決済み] Field required a bean of type that couldn't be found." エラー spring restful API using mongodb

2022-06-11 02:15:38

質問

この一週間でSpringを学び、このチュートリアルに従いました。

RESTfulなウェブサービスを構築する

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

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

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

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

これは私の モデル/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 が必要ですが、見つかりません。 type 'main.java.service.UserService' が必要ですが、見つかりませんでした。

アクションを実行します。

設定に 'main.java.service.UserService' タイプのビーンを定義することを検討してください。 を定義することを検討してください。

何が間違っているのか分からないので、ググってみると、以下のように Beans.xml ファイルをインクルードし、userServiceをその中に登録する必要があることを知りました。私はそれをやったが、それは動作していません。私はこれに本当に新しいですので、私は本当に何が起こっているかについての手がかりを持っていません。

どのように解決するのですか?

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

私のメインクラスと仮定すると ExampleApplication があり @SpringBootApplication の中で宣言されています。 com.example.something の中に宣言されている場合、その下にあるすべてのコンポーネントは com.example.something に該当するすべてのコンポーネントがスキャンされ、その間に com.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