ホームページ > Java > &#&チュートリアル > SpringBoot がカスタム クラスでサービス層を呼び出す方法

SpringBoot がカスタム クラスでサービス層を呼び出す方法

WBOY
リリース: 2023-05-11 23:01:20
転載
1331 人が閲覧しました

背景:

TCP サーバーはスマート デバイスに接続するために構築されており、デバイスからリアルタイムで送信される位置情報やその他の情報などの重要な情報をデータベースに保存する必要があります。

TCP サーバーを SpringBoot フレームワークに統合するのは、将来的に REST インターフェースを外部に提供する可能性を考慮するためであり、もちろん mybatis フレームワークを使用して実現するためでもあります。問題は、TCP サーバー メッセージを処理するときに、データベースに書き込み、DAO 層を直接呼び出し、コンパイルとレポートを行う必要があることです。エラー。

サービス層を呼び出す代わりに、通常通りにコンパイルされ、呼び出し元まで実行されます。null ポインター例外が報告されます。例外の場所が追跡され、サービスが空であることがわかります。つまり、サービス@Autowired を介して前のコントローラー層を介して挿入された層は失敗します。

解決策:

1. コード

@Component
public class ServerHandler extends IoHandlerAdapter {
    @Autowired
    protected HealthDataService healthDataService;
    private static ServerHandler  serverHandler ;
    @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
    public void init() {  
        serverHandler = this;  
        serverHandler.healthDataService = this.healthDataService;        
        // 初使化时将已静态化的testService实例化
    }  
    //测试调用
    public void test(){
        serverHandler .healthDataService.<你的service层方法>;
    }
ログイン後にコピー

2 をアップロードします。説明:

Spring のサービス層を呼び出す必要があるクラスに @Component という注釈を付けます。コンポーネントの読み込み;

また、@Autowired を通じてサービス層の Bean オブジェクトを取得します;

Bean オブジェクトを格納する次のステップを容易にするために、クラスの静的変数を宣言します;

ハイライト: Annotate @PostConstruct を渡して、初期化中に静的オブジェクトとその静的メンバー変数 healthDataService を初期化します。原理は、サービス層 Bean オブジェクトを取得し、それが解放されないように静的に格納することです。

これらの落とし穴:

最初に呼び出しを開始したとき、私はいつもそれが非常に単純だと思っていました。以前は、springmvc は設定を記述し、オブジェクトを Bean としてマークしていました。 Spring IOC コンテナの Bean は利用可能ですが、これは SpringBoot なので、おそらくまだ違いがあります。Baidu のヘルプの最初の 3 ページを試しましたが、基本的には成功しませんでした。含まれるもの:

1) @controller @compent などのツール クラスを Spring コンポーネントとして宣言し、そのツール クラスが配置されているパッケージを Spring 自動スキャン パッケージ設定に追加します; 無効

2) 新しいサービス; 無効;

springboot で相互に呼び出している複数のサービスのトランザクション処理

あるサービスのメソッド A で別のサービスのメソッド B を呼び出したいのですが、メソッド A とメソッド B の両方 データベース挿入操作があり、@Transaction アノテーションも追加されますが、メソッド B で例外がスローされた場合でも、A の挿入ステートメントは正常に実行できます。

アノテーションの構成は次のとおりです:

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED)
ログイン後にコピー

困惑しました。関連情報を検索した結果、問題は依然として @Transaction アノテーションの構成にあることがわかりました。例外の構成が必要です。ロールバック。

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED,rollbackFor = Exception.class)
ログイン後にコピー

このように、メソッド B で例外がスローされると、A の操作もロールバックされ、トランザクションが制御の役割を果たします。

以上がSpringBoot がカスタム クラスでサービス層を呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート