Que faites-vous lorsque vous souhaitez accéder aux données de la base de données d'un système monolithique existant avec l'API REST? Quand je demande à la personne en charge du système de publier l'API REST, je ne comprends pas un peu, je dois penser à l'impact de l'infrastructure, et je suis occupé maintenant, et parfois je ne prends pas les choses au sérieux. peut être.
Dans un tel cas, est-il possible de créer très facilement une API Web de style REST tout en utilisant l'environnement existant? J'ai pensé.
J'avais fait des recherches une fois vers 2017, et la composition à ce moment-là est la suivante.
--REST Configuration de l'API après la croissance
En ce qui concerne la configuration des outils réalisés avec Spring Boot léger, n'est-il pas facile de configurer Spring Boot + Spring Data REST + Spring Fox? J'ai pensé. C'est parce que c'était un projet qui attirait l'attention de la communauté Spring à cette époque.
Spring Data REST: En coopération avec la série Spring Data, la partie accès de l'extérieur est convertie en API REST.
SpringFox: projet Spring non officiel. Il trouve automatiquement l'API Rest dans votre projet et génère automatiquement un document Open API. Il prépare également un client (Swagger-UI) qui appelle l'API à partir du document.
Après avoir essayé un peu, cela fonctionnait plutôt bien, alors j'ai pensé que c'était bien. D'un autre côté, en regardant en arrière récemment, la dernière version de Spring Fox s'est arrêtée en juin 2018, La version Spring prend en charge jusqu'à 4 séries. Le problème de la prise en charge de la série Spring 5 a également été désactivé, mais le support n'est pas résolu, donc J'ai cherché d'autres alternatives et j'ai décidé de faire un échantillon.
J'ai décidé de créer d'abord l'application objet. Supposons que vous ayez une table Student dans votre système monolithique existant et que vous souhaitiez la pousser avec l'API REST.
Commencez par créer une application à partir de Spring Initializr. Je l'ai fait avec les paramètres suivants.
Créez une entité pour la table que vous souhaitez obtenir. Vous avez besoin de la clé, mais uniquement des champs que vous souhaitez obtenir.
Student.java
@Entity
public class Student {
@Id
private String id;
private String name;
private String className;
//Après cela Getter,Setter etc.
Ensuite, créez un référentiel pour accéder à la base de données. Tout d'abord, faites-le normalement pour qu'il puisse être appelé depuis le contrôleur sans ressentir Data REST.
StudentRepository.java
@Repository
public interface StudentRepository extends PagingAndSortingRepository<Student,String> {
Iterable<Student> findAll();
}
Le contrôleur a l'implémentation suivante.
StudentRestController.java
@RestController
public class StudentRestController {
@Autowired
private StudentRepository studentRepository;
@GetMapping("/students") Iterable<Student> getStudents() {
return studentRepository.findAll();
}
}
Cette fois, je vais accéder à la base de données en utilisant H2, donc je vais mettre dans divers paramètres. Pour faciliter les expérimentations plus tard, nous avons inclus des paramètres tels que l'exécution du SQL initial et la persistance des données à la fin de l'application.
application.properties
# datasource
spring.datasource.driver-class-name=org.h2.Driver
#Enregistrez la destination de persistance en tant que fichier DB dans le dossier h2db. Je voulais utiliser ON CONFLICT lors de l'initialisation des données, je l'ai donc mis en mode PostgreSQL.
spring.datasource.url=jdbc:h2:./h2db/sandbox;MODE=PostgreSQL
spring.datasource.username=dev
spring.datasource.password=dev
# resources/sdata.Initialiser les données de base de données à l'aide de SQL à chaque fois que l'application est lancée
spring.datasource.initialization-mode=always
#Conserver les données dans un fichier
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
Si vous le maintenez dans cet état et placez les fichiers suivants sous ressources, il créera une table et entrera les données initiales (ne faites rien s'il y en a une). Est-ce une fonction de Spring Data? C'est pratique.
data.sql
CREATE TABLE IF NOT EXISTS STUDENT (
ID VARCHAR(255) NOT NULL,
CLASS_NAME VARCHAR(255),
NAME VARCHAR(255),
PRIMARY KEY(ID)
);
--Utilisez ON CONFLICT pour éviter les contraintes uniques
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;
C'était long, mais cela termine le développement d'API Web avec Spring Boot + REST Controller. Gardez à l'esprit que vous n'avez pas encore utilisé Spring Data REST. Le résultat du lancement de l'application SpringBoot et de son accès avec Curl est le suivant. (Référence: jq est un outil de ligne de commande pour le formatage et le traitement de JSON.)
Ensuite, nous incorporerons Spring Data REST. Cependant, c'est extrêmement facile car il n'y a que 3 étapes (minimum 2 étapes). Ajoutez une dépendance à pom.xml.
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
Ajout de l'annotation RepositoryRestResource à la classe StudentRepository
StudentRepository.java
@Repository
@RepositoryRestResource
(collectionResourceRel = "students", path = "students")
public interface StudentRepository extends PagingAndSortingRepository<Student,String> {
(Facultatif) Ajoutez le chemin de base pour les API créées automatiquement par Spring Data REST
application.properties
#Chemin de base de l'API créé automatiquement par SpringDataREST
spring.data.rest.basePath=/api
C'est tout. Relancez l'application et essayez d'accéder à localhost: 8080 / api. Vous pouvez voir que SpringDataREST a généré automatiquement l'API REST.
Une API avec un URI appelé api / étudiants a été créée, vous pouvez donc obtenir les résultats suivants en y accédant. Avez-vous remarqué qu'il y a plus d'informations que l'API que vous avez créée précédemment? SpringDataREST est HATEOAS, il contient donc beaucoup d'informations et est avantageux pour l'utilisation d'API de clients tels que JavaScript.
Jusqu'à présent, vous avez facilement (?) Créé une API Web pour la base de données. Enfin, il prend en charge OpenAPI et SwaggerUI.
J'ai cherché sur Google SpringDataRest, OpenAPI et j'ai essayé d'utiliser Springdoc OpenAPI qui est sorti en premier. Probablement officiel de Spring, pour autant que je puisse voir l'URL. Depuis que la formule est sortie, si le développement de Spring Fox a ralenti, c'est un flux convaincant. ..
C'est une méthode d'introduction, mais ajoutez-la simplement à la dépendance. Je me souviens que la création de JavaConfig était indispensable pour SpringFox, mais il semble que Starter soit préparé ici.
pom.xml
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.1.44</version>
</dependency>
Après avoir ajouté la dépendance, vous pouvez toucher l'interface utilisateur de Swagger en redémarrant l'application et en accédant à http: // localhost: 8080 / swagger-ui / index.html? Url = / v3 / api-docs avec un navigateur. Je vais! C'est génial car vous pouvez voir une liste des WebAPI et exécuter les WebAPI à partir d'ici.
J'étais ravi, mais si vous regardez de plus près, la première chose qui s'affiche dans cette interface utilisateur est le contrôleur REST. Seuls ceux créés avec Spring Data REST ne sont pas créés.
SpringFox l'a fait pour moi, mais en y réfléchissant, je suis arrivé au problème suivant.
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.
Il a été clos par ce commentaire. .. .. Dans un autre commentaire ci-dessous, j'essaie de passer de SpringFox à SpringDoc, mais je ne peux pas changer car il n'a pas cette fonction.
Quel bordel. Est-ce mal pour moi d'apprécier l'utilisation de SpringDataRest? Certes, il y a des cas où nous avons démarré un projet à l'aide de Spring Data Rest et l'avons arrêté au milieu. J'ai compris que trop de dépendance est NG, mais j'ai pensé que ce serait bon pour faire un gâchis. .. ..
Il semble donc difficile pour le moment de réaliser facilement la construction d'API Web à accès direct à la base de données à l'aide de Spring Boot, ce que tout le monde adore.
Si vous avez lu jusqu'ici, vous trouverez peut-être plus facile de comprendre le formulaire assemblé à partir du contrôleur REST. Pour le moment, il semble qu'il n'y ait pas d'autre choix que de le faire régulièrement par cette méthode.
Étant donné que l'environnement d'exécution Java est partout autour de nous, Spring Boot est facile et efficace. J'ai pensé, mais je vais l'étudier à l'avenir sans être lié par cette idée.
https://github.com/omix222/springdatarestsample
Ce sera spécifique à la base de données, mais il semble y avoir quelque chose appelé PostgREST. https://qiita.com/kanedaq/items/0c3097604d0e86afd1e3
L'API REST est prise en charge dans CosmosDB, qui est une base de données du cloud MS. https://docs.microsoft.com/ja-jp/rest/api/cosmos-db/
Il existe de nombreux produits. Comme le serveur API CDATA. Mais je veux le faire avec un produit ouvert, pas un produit payant. en quelque sorte.
Recommended Posts