メインクラスを実行するとエラーが発生します。
エラー:
Action:
Consider defining a bean of type 'seconds47.service.TopicService' in your configuration.
Description:
Field topicService in seconds47.restAPI.topics required a bean of type 'seconds47.service.TopicService' that could not be found
TopicServiceインターフェース:
public interface TopicService {
TopicBean findById(long id);
TopicBean findByName(String name);
void saveTopic(TopicBean topicBean);
void updateTopic(TopicBean topicBean);
void deleteTopicById(long id);
List<TopicBean> findAllTopics();
void deleteAllTopics();
public boolean isTopicExist(TopicBean topicBean);
}
コントローラ:
@RestController
public class topics {
@Autowired
private TopicService topicService;
@RequestMapping(path = "/new_topic2", method = RequestMethod.GET)
public void new_topic() throws Exception {
System.out.println("new topic Java2");
}
}
実装クラス:
public class TopicServiceImplementation implements TopicService {
@Autowired
private TopicService topicService;
@Autowired
private TopicRepository topicRepository;
@Override
public TopicBean findById(long id) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public TopicBean findByName(String name) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void saveTopic(TopicBean topicBean) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void updateTopic(TopicBean topicBean) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void deleteTopicById(long id) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public List<TopicBean> findAllTopics() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void deleteAllTopics() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean isTopicExist(TopicBean topicBean) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
残りのクラスも定義されています。メインクラスでcomponentScan
を宣言しているにもかかわらず、なぜスローするのかわかりません。
メインクラス:
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
@ComponentScan(basePackages = {"seconds47"})
@EnableJpaRepositories("seconds47.repository")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
私はこのようなパッケージを持っています:
seconds47
seconds47.beans
seconds47.config
seconds47.repository
seconds47.restAPI
seconds47.service
コンポーネントのスキャンによってSpring Beanとして認識されるためには、クラスに@Component
アノテーションまたはその派生(@Service
、@Repository
など)が必要です。したがって、@Component
をクラスに追加すると、問題が解決するはずです。
TopicService
はService
クラスなので、@Service
アノテーションを付けて、SpringがこのBeanを自動配線するようにしてください。そのようです:
@Service
public class TopicServiceImplementation implements TopicService {
...
}
これで問題が解決します。
Bean自体を注入しようとしています。それは明らかに機能しません。
TopicServiceImplementation
はTopicService
を実装します。そのクラスは、「TopicService」を(フィールドで!)自動配線しようとします。したがって、本質的にはコンテキストに自分自身を挿入するように要求しています。
エラーメッセージの内容を編集したようです:Field topicService in seconds47.restAPI.topics
はクラスではありません。機密情報を非表示にする必要がある場合は、他の人があなたを助けるのが非常に難しくなるので注意してください。
実際の問題に戻ると、TopicService
を挿入すること自体があなたの側の不具合であるように見えます。
破損したjarファイルを置き換えることで解決しました。
しかし、これらの破損したjarファイルを見つけるには、3つのIDEでアプリケーションを実行する必要があります。1)Intellij Idea 2)NetBeans 3)Eclipse。
Netbeansは、破損したjarの最大数に関する情報を提供してくれました。実行に伴うNetbeansでは、(プロジェクトを右クリックしてから)ビルドオプションを使用して、破損したjarファイルの詳細を確認します。
これらのエラーの根本原因を見つけるのに15時間以上かかりました。それが誰にも役立つことを願っています。
SpringConfig.JavaファイルでサービスのBeanを作成することで、この問題を解決しました。以下のコードを確認してください、
@Configuration
public class SpringConfig {
@Bean
public TransactionService transactionService() {
return new TransactionServiceImpl();
}
}
このファイルのパスは、下の画像に示されています Spring boot application folder structure
更新する必要があります
scanBasePackages = { "com.exm.Java" }
サービスにパスを追加するには(@serviceで注釈を付けた後)
構成で「moviecruser.repository.MovieRepository」タイプのBeanを定義することを検討してください。
正しい依存関係を追加しなかった場合、このタイプの問題が発生します。私が直面したのと同じ問題ですが、JPA依存関係が正しく機能していないことがわかったので、最初の依存関係が正しいかどうかを確認してください。
例えば:-
私が使用した依存関係:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
説明(この例外を見つけた):-
Moviecruser.serviceImple.MovieServiceImplのコンストラクターのパラメーター0には、見つからない 'moviecruser.repository.MovieRepository'タイプのBeanが必要でした。
アクション:
変更後の依存関係:-
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
応答:-
2019-09-06 23:08:23.202 INFO 7780-
[main] moviecruser.MovieCruserApplication]:10.585秒でMovieCruserApplicationを開始しました(11.357で実行されているJVM)
Pom.xmlまたはgradleファイルに依存関係が追加されていることを確認してください
spring-boot-starter-data-jpa