TCP サーバーはスマート デバイスに接続するために構築されており、デバイスからリアルタイムで送信される位置情報やその他の情報などの重要な情報をデータベースに保存する必要があります。
TCP サーバーを SpringBoot フレームワークに統合するのは、将来的に REST インターフェースを外部に提供する可能性を考慮するためであり、もちろん mybatis フレームワークを使用して実現するためでもあります。問題は、TCP サーバー メッセージを処理するときに、データベースに書き込み、DAO 層を直接呼び出し、コンパイルとレポートを行う必要があることです。エラー。
サービス層を呼び出す代わりに、通常通りにコンパイルされ、呼び出し元まで実行されます。null ポインター例外が報告されます。例外の場所が追跡され、サービスが空であることがわかります。つまり、サービス@Autowired を介して前のコントローラー層を介して挿入された層は失敗します。
@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层方法>; }
Spring のサービス層を呼び出す必要があるクラスに @Component という注釈を付けます。コンポーネントの読み込み;
また、@Autowired を通じてサービス層の Bean オブジェクトを取得します;
Bean オブジェクトを格納する次のステップを容易にするために、クラスの静的変数を宣言します;
ハイライト: Annotate @PostConstruct を渡して、初期化中に静的オブジェクトとその静的メンバー変数 healthDataService を初期化します。原理は、サービス層 Bean オブジェクトを取得し、それが解放されないように静的に格納することです。
これらの落とし穴:
最初に呼び出しを開始したとき、私はいつもそれが非常に単純だと思っていました。以前は、springmvc は設定を記述し、オブジェクトを Bean としてマークしていました。 Spring IOC コンテナの Bean は利用可能ですが、これは SpringBoot なので、おそらくまだ違いがあります。Baidu のヘルプの最初の 3 ページを試しましたが、基本的には成功しませんでした。含まれるもの:
1) @controller @compent などのツール クラスを Spring コンポーネントとして宣言し、そのツール クラスが配置されているパッケージを Spring 自動スキャン パッケージ設定に追加します; 無効
2) 新しいサービス; 無効;
あるサービスのメソッド 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 サイトの他の関連記事を参照してください。