それで、私は数週間のうちにSpringを学びました、このチュートリアルに続いていました
私がそれを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を登録する必要があることを見つけました。私はそうしましたが、うまくいきません。私は本当にこれに慣れていないので、何が起こっているのか私には本当にわかりません。
それを解決しました。そのため、デフォルトでは、@SpringBootApplication
宣言に該当するすべてのパッケージがスキャンされます。
@SpringBootApplication
宣言を持つ私のメインクラスExampleApplication
がcom.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
Service/UserService.Javaに@Service
を追加します。
私も同じエラーがありました:
***************************
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);
}
}
私は同じ問題に遭遇しました、そして私がしなければならなかったすべてはサービス、daoとドメインパッケージより1つ上のレベルのパッケージにアプリケーションを配置することでした。
このスレッドは現在古くなっていますが、私は自分の答えを投稿しています。これは他の人に役立つかもしれません。
私は同じ問題を抱えていました。他のモジュールに同じ名前の別のクラスがあることがわかりました。私はそのクラスの名前を変更し、それが問題を解決しました。
自動インポートのため、多くの時間がかかりました。 Intellij Ideaさんが@Service
の代わりにimport org.jvnet.hk2.annotations.Service;
からimport org.springframework.stereotype.Service;
をインポートしました!
通常、この問題を解決するには2つの側面があります。
@Component
のように適切なアノテーションを使用する必要があります。ちなみに、 @ Component、@ Repository、@ Service、および@Controller の違いについては、非常に良い説明があります。
コントローラクラスに@Componentを追加します。この作品は
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 を付けます。
すべての@注釈を使用して私の問題を解決しました。 (はい、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
@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);
}
今ではその作業
私の場合、コピー&ペーストをしている間に誤ってサービスクラスabstract
を定義しました。
@Serivce
@Valdiated
public abstract class MyService { // remove the abstract modifier!!!
}
サービスの実装に@Service
注釈を追加する必要があります。
私のターゲットフォルダの私のMapper実装クラスは削除されていたので、私のMapperインターフェースはもう実装クラスを持っていませんでした。したがって、私は同じエラーを得ましたField *** required a bean of type ***Mapper that could not be found.
私は単にmavenを使ってマッパーの実装を再生成し、プロジェクトを更新しなければなりませんでした...
私の場合は、同じレベルのモデル、コントローラ、サービスパッケージを含むパッケージ(com.example.start)にクラスMyprojectApplicationを配置しました。