私はここ数週間Springを学んでいて、このチュートリアルに従っています
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