ホームページ Java &#&チュートリアル Spring Framework の知識の概要 - Bean に注入されるさまざまな例外

Spring Framework の知識の概要 - Bean に注入されるさまざまな例外

Nov 22, 2016 pm 03:58 PM
spring

最近、Spring フレームワークと Hibernate フレームワークを統合するときに一連の例外が発生しました。今回は主に Spring フレームワークで考えられる例外と解決策について説明します。

sping の強力な Bean コンテナ管理メカニズムを使用して、BeanFactory を通じて javabean のライフサイクル管理を簡単に実装します。ただし、構成管理中に必ずいくつかの例外が発生します。

例外 1: […] タイプの適格な Bean が見つかりません。依存関係の場合

たとえば、BeanB は BeanA に自動的に挿入されます

@Component
public class BeanA {

@Autowired
private BeanB dependency;

}

この時点で BeanB が sping の Cntextl で定義されていない場合、起動時に例外がスローされます: そのような Bean 定義例外はありません:

org.springframework.beans.factory.NoSuchBeanDefinitionException:
依存関係に対してタイプ [org.baeldung.packageB.BeanB] の適格な Bean が見つかりません:
少なくとも期待されていますこの依存関係のオートワイヤ候補として適格な 1 つの Bean。
依存関係アノテーション: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

問題の理由は単純で、適格な Bean が少なくとも 1 つ必要であるということです。この依存関係のオートワイヤー候補として。 依存関係注入用に定義された Bean が少なくとも 1 つ必要です。もちろん、アノテーションの使用時およびアノテーション スキャンの設定時にパッケージ スキャンのパスを設定しなかったことが考えられるもう 1 つの理由です。それ以外の場合は Bean が定義されるべきではありません。

例外 2: タイプ […] の適格な Bean が定義されていません

この例外は、タイプの適格な Bean が存在しないことを意味します。その理由は、一意の Bean ではなく、2 つ以上の同一の Bean が定義されているためです。インターフェース IBeanB があり、その 2 つの実装クラス Bean1 と Bean2 があります

@Component
public class BeanB1 は IBeanB {
//
}を実装します
@Component
public class BeanB2 は IBeanB {
//
}を実装します

BeanA が挿入される場合現時点では、インターフェース IBeanB を使用する場合、Spring は

@Component
public class BeanA {

@Autowired
private IBeanB dependency;

}

を注入するためにどの実装クラスを使用するべきかを知りません。この時点で、BeanFactory は例外 NoSuchBeanDefinitionException をスローします

原因: org.springframework.beans.factory.NoUniqueBeanDefinitionException:
タイプ [org.baeldung.packageB.IBeanB] の適格な Bean が定義されていません:
単一の一致する Bean が予期されましたが、2 つ見つかりました: beanB1、beanB2

例外から、単一の一致するBeanが期待されましたが、2"が見つかりました。唯一のBeanが見つからなかったことがわかります。

その後、次のメソッドで解決できます

@Component
public class BeanA {

@Autowired
@ Qualifier("beanB2")
private IBeanB dependency;

}

sping は、どの Bean がインジェクションのオブジェクトとして使用されているかを明確に認識します

例外 3: […] という名前の Bean が定義されていません

この例外が発生した場合。 、名前で Bean を見つけるために Sping コンテキストに移動すると、例外 NoSuchBeanDefinitionException が発生する可能性があります

@Component
public class BeanAimplements InitializingBean {

@Autowired
private ApplicationContext context;

@Override
public void afterPropertiesSet() {
context.getBean("someBeanName");
}
}

ここで検索すると、someBeanName という名前の定義がないため、例外が発生します

原因: org.springframework.beans.factory.NoSuchBeanDefinitionException:
「 」という名前の Bean がありませんsomeBeanName' が定義されています

この名前の Bean 定義が存在しないことが明確に指摘されています。

例外 4: プロキシ Beans

Bean が Spring コンテキストで JDK 動的プロキシ メカニズムを使用する場合、Bean が挿入されると、プロキシ クラスはターゲット オブジェクトを継承しませんが、同じインターフェイスを実装します。インターフェース を使用する場合は問題ありませんが、実装クラスが挿入される場合、プロキシ クラスはターゲット クラスを継承しないため、現時点では Sping コンテナは Bean を見つけることができません。 Bean がプロキシされる非常に一般的なシナリオは、Spring のトランザクション サポート機能を使用することです。 @Transactional アノテーションを使用してトランザクションを示すか、設定ファイルで設定できます。

たとえば、ServiceA が ServiceB を挿入し、両方のサービスが同時にトランザクションで構成されている場合、クラス挿入を通じて問題が発生します。

@Service
@Transactional
public class ServiceAimplements IServiceA{

@Autowired
private ServiceB serviceB;

}

@Service
@Transactional
public class ServiceBimplement IServiceB{

}

これと同じインターフェイス インジェクションが使用されている場合、両方のサービスは正常に実行されます。

@Service
@Transactional
public class ServiceA は IServiceA を実装します{

@Autowired
private IServiceB serviceB;

}

@Service
@Transactional
public class ServiceB は IServiceB を実装します{

}


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Spring Boot と OpenAI の出会いによる新しいプログラミング パラダイム Spring Boot と OpenAI の出会いによる新しいプログラミング パラダイム Feb 01, 2024 pm 09:18 PM

2023年、AI技術が注目を集め、プログラミング分野を中心にさまざまな業界に大きな影響を与えています。 AI テクノロジーの重要性に対する人々の認識はますます高まっており、Spring コミュニティも例外ではありません。 GenAI (汎用人工知能) テクノロジーの継続的な進歩に伴い、AI 機能を備えたアプリケーションの作成を簡素化することが重要かつ緊急になっています。このような背景から、AI 機能アプリケーションの開発プロセスを簡素化し、シンプルかつ直観的にし、不必要な複雑さを回避することを目的とした「SpringAI」が登場しました。 「SpringAI」により、開発者はAI機能を搭載したアプリケーションをより簡単に構築でき、使いやすく、操作しやすくなります。

Spring Boot と Spring AI を使用して生成人工知能アプリケーションを構築する Spring Boot と Spring AI を使用して生成人工知能アプリケーションを構築する Apr 28, 2024 am 11:46 AM

Spring+AI は業界リーダーとして、強力で柔軟な API と高度な機能を通じてさまざまな業界に最先端のソリューションを提供します。このトピックでは、さまざまな分野での Spring+AI の応用例を詳しく掘り下げ、Spring+AI がどのように特定のニーズを満たし、目標を達成し、これらの教訓をより広範囲のアプリケーションに拡張するかを示します。このトピックが Spring+AI の無限の可能性をより深く理解し、活用するきっかけになれば幸いです。 Spring フレームワークはソフトウェア開発の分野で 20 年以上の歴史があり、Spring Boot 1.0 バージョンがリリースされてから 10 年が経過しました。今、その春に異論を唱える人はいない

Springプログラマティックトランザクションの実装方法は何ですか? Springプログラマティックトランザクションの実装方法は何ですか? Jan 08, 2024 am 10:23 AM

Spring プログラムによるトランザクションを実装する方法: 1. TransactionTemplate を使用する; 2. TransactionCallback および TransactionCallbackWithoutResult を使用する; 3. Transactional アノテーションを使用する; 4. TransactionTemplate を @Transactional と組み合わせて使用​​する; 5. トランザクション マネージャーをカスタマイズする。

Java Springでスケジュールされたタスクを実装する方法 Java Springでスケジュールされたタスクを実装する方法 May 24, 2023 pm 01:28 PM

Java によるスケジュールされたタスクの実装 Jdk に付属のライブラリでは、スケジュールされたタスクを実装する 2 つの方法があります。1 つは Timer で、もう 1 つは ScheduledThreadPoolExecutor です。 Timer+TimerTask が Timer を作成すると、TimerTask タスクのスケジュールに使用できるスレッドが作成されます。Timer には 4 つの構築メソッドがあり、Timer スレッドの名前と、それをデーモン スレッドとして設定するかどうかを指定できます。デフォルト名は Timer-number で、デフォルトはデーモン スレッドではありません。主なメソッドは 3 つあります。 cancel(): タスクのスケジュールを終了し、現在スケジュールされているすべてのタスクをキャンセルします。実行中のタスクは影響を受けません。 purge(): タスク キューからタスクを削除します。

Spring Boot と Spring Cloud の違いと関係 Spring Boot と Spring Cloud の違いと関係 Jun 22, 2023 pm 06:25 PM

SpringBoot と SpringCloud は両方とも、開発者がマイクロサービス アプリケーションをより迅速に構築およびデプロイできるようにする Spring Framework の拡張機能ですが、それぞれ異なる目的と機能を持っています。 SpringBoot は、Java アプリケーションを迅速に構築するためのフレームワークであり、開発者は Spring ベースのアプリケーションをより迅速に作成してデプロイできるようになります。スタンドアロンの実行可能な Spring アプリケーションを構築するための、シンプルでわかりやすい方法を提供します。

Spring でトランザクション分離レベルを設定する方法 Spring でトランザクション分離レベルを設定する方法 Jan 26, 2024 pm 05:38 PM

Spring でトランザクション分離レベルを設定する方法: 1. @Transactional アノテーションを使用します; 2. Spring 構成ファイルに設定します; 3. PlatformTransactionManager を使用します; 4. Java 構成クラスに設定します。詳細な導入方法: 1. @Transactional アノテーションを使用し、トランザクション管理が必要なクラスまたはメソッドに @Transactional アノテーションを追加し、属性に分離レベルを設定します。 2. Spring の設定ファイルなどで

Spring Cloud をゼロから学ぶ Spring Cloud をゼロから学ぶ Jun 22, 2023 am 08:11 AM

Java 開発者として、Spring フレームワークを学習して使用することは必須のスキルです。クラウド コンピューティングとマイクロサービスの人気に伴い、Spring Cloud の学習と使用も習得しなければならないスキルになりました。 SpringCloud は、分散システムを迅速に構築するための SpringBoot に基づく開発ツールセットです。サービスの登録と検出、構成センター、負荷分散、サーキット ブレーカーなどの一連のコンポーネントを開発者に提供し、開発者がマイクロ サービスを構築できるようにします。

史上最も強力な組織 Spring で最もよく使用される 7 つのアノテーション! 史上最も強力な組織 Spring で最もよく使用される 7 つのアノテーション! Jul 26, 2023 pm 04:38 PM

テクノロジーの更新と反復により、Java5.0 はアノテーションをサポートし始めました。 Java の主要なフレームワークである Spring は、バージョン 2.5 に更新されて以来、徐々に XML 構成を放棄し始めており、Spring フレームワークを制御するために使用されるアノテーションが増えています。

See all articles