Erstellt einen TCP-Server für die Verbindung mit intelligenten Geräten und muss dann wichtige Informationen wie die vom Gerät gesendete Position in Echtzeit in der Datenbank speichern.
Um die Möglichkeit in Betracht zu ziehen, in Zukunft eine Restschnittstelle zur Außenwelt bereitzustellen, ist der TCP-Server in das SpringBoot-Framework integriert. Natürlich soll auch das Mybatis-Framework verwendet werden, um den Datenzugriff so schnell wie möglich zu erreichen. Lösen Sie dann verschiedene Probleme, z. B. das Starten und Abmelden. Bei der Verarbeitung von TCP-Servernachrichten müssen Sie in die Datenbank schreiben, die DAO-Schicht direkt aufrufen sowie Fehler kompilieren und melden.
Stattdessen wird die Service-Schicht aufgerufen, die Kompilierung erfolgt normal, und wenn sie zum aufrufenden Ort ausgeführt wird, wird eine Nullzeiger-Ausnahme gemeldet. Der Ausnahmeort wird verfolgt und der Dienst wird als leer befunden, was bedeutet, dass die Service-Schicht Durch @Autowired von der vorherigen Controller-Ebene injiziert, schlägt fehl.
Laden Sie die Klasse, die die Service-Schicht von Spring aufrufen muss, über die @Component-Annotation.
Rufen Sie auch das Bean-Objekt der Service-Schicht ab über @Autowired;
Deklarieren Sie im nächsten Schritt eine statische Variable für die Klasse, um die Speicherung des Bean-Objekts zu erleichtern.
Wichtiger Punkt: Initialisieren Sie das statische Objekt und seine statische Mitgliedsvariable healthDataService während der Initialisierung. Das Prinzip besteht darin, das Service-Layer-Bean-Objekt abzurufen und statisch zu speichern, um zu verhindern, dass es freigegeben wird.
Diese Fallstricke:
Als ich zum ersten Mal anrief, dachte ich immer, es sei sehr einfach. In der Vergangenheit habe ich eine Konfiguration für springmvc geschrieben, das Objekt als Bean markiert und dann die Beans aufgerufen Spring IOC-Container nach Belieben. Aber das ist SpringBoot. Ich denke, es gibt immer noch einen Unterschied. Ich habe die ersten drei Seiten der Hilfe ausprobiert, aber es war im Grunde erfolglos. Einschließlich:
1) Deklarieren Sie die Werkzeugklasse als Federkomponente, z. B. @controller @compent usw., und fügen Sie das Paket hinzu, in dem sich die Werkzeugklasse in der Paketeinstellung für den automatischen Federscan befindet.
2) Erstellen Sie a neuer Dienst; ungültig;
Ich möchte Methode B eines anderen Dienstes in Methode A eines Dienstes aufrufen. Sowohl Methode A als auch Methode B verfügen über Datenbankeinfügungsoperationen und die @Transaction Anmerkungen werden ebenfalls hinzugefügt, aber wenn in Methode B eine Ausnahme ausgelöst wird, kann die Einfügeanweisung in A weiterhin erfolgreich ausgeführt werden.
@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层方法>; }
Nach der Suche nach relevanten Informationen liegt das Problem immer noch in der Konfiguration der @Transaction-Annotation und es muss ein Ausnahme-Rollback konfiguriert werden.
@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED)
Auf diese Weise wird, wenn in Methode B eine Ausnahme ausgelöst wird, auch der Vorgang in A zurückgesetzt und die Transaktion spielt eine steuernde Rolle.
Das obige ist der detaillierte Inhalt vonSo ruft SpringBoot die Serviceschicht in einer benutzerdefinierten Klasse auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!