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.
Ich hatte es einmal um 2017 recherchiert und die Zusammensetzung zu dieser Zeit ist wie folgt.
--REST API Konfiguration nach dem Wachstum
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.
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.
Erstellen Sie zunächst eine App aus Spring Initializr. Ich habe es mit den folgenden Einstellungen gemacht.
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.)
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.
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.
Bis zu diesem Punkt haben Sie einfach (?) Eine Web-API für die DB erstellt. Schließlich unterstützt es OpenAPI und SwaggerUI.
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.
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. .. ..
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.
https://github.com/omix222/springdatarestsample
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