「フィールドには見つからないタイプのBeanが必要です。」エラーSpring RESTful API、MongoDB使用 質問する

「フィールドには見つからないタイプのBeanが必要です。」エラーSpring RESTful API、MongoDB使用 質問する

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

RESTful Web サービスの構築

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

これは私のサービス/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 を登録する必要があることがわかりました。それを実行しましたが、うまくいきません。私はこの分野にまったく不慣れなので、何が起こっているのかまったくわかりません。

ベストアンサー1

解決しました。デフォルトでは、@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

おすすめ記事