Träumen Sie davon, einfach eine Web-API für die Datenbank eines vorhandenen Java-Systems zu erstellen

Hintergrund und was Sie tun möchten

Was tun Sie, wenn Sie mit der REST-API auf die Daten in der Datenbank eines vorhandenen monolithischen Systems zugreifen möchten? Wenn ich die für das System verantwortliche Person auffordere, die REST-API zu veröffentlichen, verstehe ich ein wenig nicht, ich muss über die Auswirkungen der Infrastruktur nachdenken, und ich bin jetzt beschäftigt, und manchmal werde ich es nicht ernst. vielleicht.

Ist es in einem solchen Fall möglich, eine Web-API im REST-Stil sehr einfach zu erstellen, während die vorhandene Umgebung verwendet wird? Ich dachte.

Vergangene Überprüfung

Ich hatte es einmal um 2017 recherchiert und die Zusammensetzung zu dieser Zeit ist wie folgt.

--REST API Konfiguration nach dem Wachstum image.png

Ist es nicht einfach, Spring Boot + Spring Data REST + Spring Fox als Konfiguration eines Tools mit leichtem Spring Boot zu konfigurieren? Ich dachte. Dies liegt daran, dass es sich um ein Projekt handelte, das zu dieser Zeit in der Frühlingsgemeinschaft Aufmerksamkeit erregte.

Spring Data REST: In Zusammenarbeit mit der Spring Data-Reihe wird der Zugriffsteil von außen in die REST-API konvertiert.

SpringFox: Frühlingsprojekt inoffiziell. Es findet automatisch die Rest-API in Ihrem Projekt und generiert automatisch ein Open API-Dokument. Außerdem wird ein Client (Swagger-UI) vorbereitet, der die API aus dem Dokument aufruft.

Nachdem ich es ein wenig versucht hatte, funktionierte es ziemlich gut, also fand ich es gut. Rückblickend wurde die letzte Veröffentlichung von Spring Fox im Juni 2018 eingestellt. Die Federversion unterstützt bis zu 4 Serien. Das Problem der Unterstützung für die Spring 5-Serie wurde ebenfalls deaktiviert, die Unterstützung ist jedoch nicht behoben Ich beschloss herauszufinden, ob es eine andere Alternative gibt, und eine Probe zu machen.

Diese Studie

Ich habe mich entschlossen, zuerst die Betreff-App zu erstellen. Angenommen, Sie haben eine Student-Tabelle in Ihrem vorhandenen Monolith-System und möchten diese mit der REST-API stecken.

App-Erstellung

Erstellen Sie zunächst eine App aus Spring Initializr. Ich habe es mit den folgenden Einstellungen gemacht.

image.png

Erstellen Sie eine Entität für die Tabelle, die Sie erhalten möchten. Sie benötigen den Schlüssel, aber nur die Felder, die Sie erhalten möchten.

Student.java


@Entity
public class Student {
    @Id
    private String id;
    private String name;
    private String className;
    //Danach Getter,Setter etc.

Erstellen Sie als Nächstes ein Repository für den Zugriff auf die Datenbank. Stellen Sie es zunächst normal ein, damit es vom Controller aufgerufen werden kann, ohne dass Data REST auftritt.

StudentRepository.java


@Repository
public interface StudentRepository extends PagingAndSortingRepository<Student,String> {
    Iterable<Student> findAll();
}

Controller hat die folgende Implementierung.

StudentRestController.java


@RestController
public class StudentRestController {
    @Autowired
    private StudentRepository studentRepository;

    @GetMapping("/students") Iterable<Student> getStudents() {
        return studentRepository.findAll();
    }
}

Dieses Mal werde ich mit H2 auf die Datenbank zugreifen, also werde ich verschiedene Einstellungen vornehmen. Um das spätere Experimentieren zu vereinfachen, haben wir Einstellungen wie das Ausführen des anfänglichen SQL und das Persistieren der Daten am Ende der Anwendung hinzugefügt.

application.properties


# datasource
spring.datasource.driver-class-name=org.h2.Driver
#Speichern Sie das Persistenzziel als DB-Datei im Ordner h2db. Ich wollte ON CONFLICT beim Initialisieren der Daten verwenden, also habe ich es auf den PostgreSQL-Modus gesetzt.
spring.datasource.url=jdbc:h2:./h2db/sandbox;MODE=PostgreSQL
spring.datasource.username=dev
spring.datasource.password=dev
# resources/sdata.Initialisieren Sie DB-Daten bei jedem Start der App mit SQL
spring.datasource.initialization-mode=always

#Daten in Datei speichern
spring.jpa.hibernate.ddl-auto=update

# h2 for debug tool
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.h2.console.settings.web-allow-others=true

Wenn Sie es in diesem Zustand belassen und die folgenden Dateien unter Ressourcen ablegen, wird eine Tabelle erstellt und Anfangsdaten eingegeben (tun Sie nichts, wenn es eine gibt). Ist es eine Funktion von Spring Data? Es ist bequem.

data.sql


CREATE TABLE IF NOT EXISTS STUDENT (
 ID VARCHAR(255) NOT NULL,
 CLASS_NAME VARCHAR(255),
 NAME VARCHAR(255),
 PRIMARY KEY(ID)
);
--Verwenden Sie ON CONFLICT, um eindeutige Einschränkungen zu vermeiden
INSERT INTO STUDENT VALUES ('1','A CLASS','TAKA')
    ON CONFLICT DO NOTHING;
INSERT INTO STUDENT VALUES ('2','A CLASS','KASHI')
    ON CONFLICT DO NOTHING;
INSERT INTO STUDENT VALUES ('3','B CLASS','KIKUCHI')
    ON CONFLICT DO NOTHING;

Es hat lange gedauert, aber damit ist die Web-API-Entwicklung mit Spring Boot + REST Controller abgeschlossen. Beachten Sie, dass Sie Spring Data REST bisher noch nicht verwendet haben. Das Ergebnis des Startens der SpringBoot-App und des Zugriffs mit Curl ist wie folgt. (Referenz: jq ist ein Befehlszeilenprogramm zum Formatieren und Verarbeiten von JSON.) image.png

Als nächstes werden wir Spring Data REST integrieren. Es ist jedoch sehr einfach, da es nur 3 Schritte gibt (mindestens 2 Schritte). Fügen Sie pom.xml eine Abhängigkeit hinzu.

pom.xml


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-rest</artifactId>
		</dependency>

Hinzufügen der Annotation RepositoryRestResource zur StudentRepository-Klasse

StudentRepository.java


@Repository
@RepositoryRestResource
        (collectionResourceRel = "students", path = "students")
public interface StudentRepository extends PagingAndSortingRepository<Student,String> {

(Optional) Fügen Sie einen Basispfad für APIs hinzu, die automatisch von Spring Data REST erstellt werden

application.properties


#Basispfad der API, der automatisch von SpringDataREST erstellt wird
spring.data.rest.basePath=/api

Das ist es. Starten Sie die App neu und versuchen Sie, auf localhost zuzugreifen: 8080 / api. Sie können sehen, dass SpringDataREST die REST-API automatisch generiert hat.

image.png

Es wurde eine API mit einer URI namens api / students erstellt, sodass Sie die folgenden Ergebnisse erhalten, indem Sie darauf zugreifen. Haben Sie bemerkt, dass es mehr Informationen als die zuvor erstellte API gibt? SpringDataREST ist HATEOAS, enthält also viele Informationen und ist vorteilhaft für die Verwendung von APIs von Clients wie JavaScript. image.png

Bis zu diesem Punkt haben Sie einfach (?) Eine Web-API für die DB erstellt. Schließlich unterstützt es OpenAPI und SwaggerUI.

Was ist die Alternative zu SpringFox?

Ich habe mit SpringDataRest, OpenAPI gegoogelt und versucht, Springdoc OpenAPI zu verwenden, das zuerst herauskam. Wahrscheinlich Frühlingsbeamter, soweit ich die URL sehen kann. Wenn sich die Entwicklung von Spring Fox verlangsamt hat, ist dies ein überzeugender Fluss, da die Formel herausgekommen ist. ..

Es ist eine Einführungsmethode, aber fügen Sie sie einfach der Abhängigkeit hinzu. Ich erinnere mich, dass die Erstellung von JavaConfig für SpringFox unverzichtbar war, aber anscheinend ist Starter hier vorbereitet.

pom.xml


        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.1.44</version>
        </dependency>

Nach dem Hinzufügen der Abhängigkeit können Sie die Swagger-Benutzeroberfläche berühren, indem Sie die Anwendung neu starten und mit einem Browser auf http: // localhost: 8080 / swagger-ui / index.html? Url = / v3 / api-docs zugreifen. Ich werde! Es ist großartig, weil Sie hier eine Liste von WebAPIs sehen und tatsächlich WebAPIs ausführen können.

image.png

Ich war begeistert, aber wenn Sie genau hinschauen, ist das erste, was in dieser Benutzeroberfläche angezeigt wird, der REST-Controller. Nur diejenigen, die mit Spring Data REST erstellt wurden, werden nicht erstellt.

SpringFox hat es für mich getan, aber als ich darüber nachdachte, kam ich zu folgendem Problem.

Documentation is available on the official page: https://springdoc.github.io/springdoc-openapi-demos/ Spring Data Rest is not a priority. It will be supported on a future release.

Es wurde durch diesen Kommentar geschlossen. .. .. In einem anderen Kommentar unten versuche ich, von SpringFox zu SpringDoc zu wechseln, aber ich kann nicht wechseln, da es diese Funktion nicht hat.

Was für ein Chaos. Ist es falsch für mich, SpringDataRest zu nutzen? Es gibt sicherlich Fälle, in denen wir ein Projekt mit Spring Data Rest gestartet und in der Mitte gestoppt haben. Ich habe verstanden, dass zu viel Abhängigkeit NG ist, aber ich dachte, es wäre gut, um ein Chaos zu verursachen. .. ..

Fazit

Im Moment scheint es daher schwierig zu sein, die Erstellung einer DB-Direktzugriffs-Web-API mit Spring Boot, die jeder liebt, einfach zu realisieren.

Wenn Sie dies bisher gelesen haben, fällt es einigen Leuten möglicherweise leichter, vom REST-Controller aus zu erstellen. Im Moment scheint es keine andere Wahl zu geben, als es stetig mit dieser Methode zu machen.

Da die Java-Ausführungsumgebung überall um uns herum ist, ist Spring Boot einfach und gut. Ich dachte, aber ich werde es in Zukunft untersuchen, ohne an diese Idee gebunden zu sein.

Quellcode durch Überprüfung erstellt

https://github.com/omix222/springdatarestsample

Zukunftsbezug

Es wird DB-spezifisch sein, aber es scheint etwas zu geben, das PostgREST heißt. https://qiita.com/kanedaq/items/0c3097604d0e86afd1e3

Die REST-API wird in CosmosDB unterstützt, einer Datenbank der MS Cloud. https://docs.microsoft.com/ja-jp/rest/api/cosmos-db/

Es gibt viele Produkte. Wie CDATA API Server. Aber ich möchte es mit einem offenen Produkt machen, nicht mit einem bezahlten Produkt. irgendwie.

Recommended Posts

Träumen Sie davon, einfach eine Web-API für die Datenbank eines vorhandenen Java-Systems zu erstellen
Holen Sie sich ganz einfach Ganzzahlen aus den Systemeigenschaften in Java
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
Die Geschichte der Einführung von Gradle als Nachrüstung eines bestehenden Systems, das keine Pakete verwaltet
Vergleichen Sie Elemente eines Arrays (Java)
Eine Geschichte über die Java 11-Unterstützung für Webdienste
Informationen zur Beschreibungsreihenfolge der Java-Systemeigenschaften
ChatWork4j für die Verwendung der ChatWork-API in Java
Messen Sie die Größe eines Ordners mit Java
Eine Sammlung einfacher Fragen für Java-Anfänger
Der Weg zum Erstellen eines Webdienstes (Teil 1)
Ich habe einen Testcode (Junit & mockit) für den Code geschrieben, der die AWS-API (Java) aufruft.
Grundlagen von HTML-Formularen, die für die Erstellung von Webanwendungen unverzichtbar sind
Rufen Sie eine Liste mit MBean-Informationen für Java-Anwendungen ab
[Für Anfänger] Verstehen Sie schnell die Grundlagen von Java 8 Lambda
Verwenden Sie Java-Lambda-Ausdrücke außerhalb der Stream-API
[Java] Beim Schreiben der Quelle ... Memorandum ①
Java: Zeitgesteuerte Token-Verwaltungsklasse für die Web-API-Authentifizierung
Links für jede Version (japanische Version) der Java SE-API
Eine Übersicht über das native Java-Framework Quarkus von Kubernetes
Ein Memorandum zum Erstellen eines erweiterten Loggers mit org.slf4j.Logger
Eine kurze Erklärung eines Labyrinthspiels, das in Java für Cousins der Grundschule erstellt wurde
Zusammenfassung der Punkte, die Java-Programmierer beim ersten Lesen der Kotlin-Quelle als rutschig empfinden