Rêver de créer facilement une API Web pour la base de données d'un système Java existant

Contexte et ce que vous voulez faire

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é.

Examen passé

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 image.png

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.

Cette étude

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.

Création d'applications

Commencez par créer une application à partir de Spring Initializr. Je l'ai fait avec les paramètres suivants.

image.png

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.) image.png

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.

image.png

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. image.png

Jusqu'à présent, vous avez facilement (?) Créé une API Web pour la base de données. Enfin, il prend en charge OpenAPI et SwaggerUI.

Quelle est l'alternative à SpringFox?

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.

image.png

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. .. ..

Conclusion

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.

Code source créé par vérification

https://github.com/omix222/springdatarestsample

Référence future

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

Rêver de créer facilement une API Web pour la base de données d'un système Java existant
Obtenez facilement des entiers à partir des propriétés système en Java
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
L'histoire de l'introduction de Gradle en tant que modernisation d'un système existant qui ne gérait pas de packages
Comparer les éléments d'un tableau (Java)
Une histoire sur la prise en charge de Java 11 pour les services Web
A propos de l'ordre de description des propriétés système Java
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Mesurer la taille d'un dossier avec Java
Une collection de questions simples pour les débutants Java
La voie de la création d'un service Web (partie 1)
J'ai écrit un code de test (Junit & mockit) pour le code qui appelle l'API AWS (Java)
Les bases des formulaires HTML indispensables à la création d'applications Web
Obtenir une liste d'informations MBean pour les applications Java
[Pour les débutants] Comprendre rapidement les bases de Java 8 lambda
Utiliser des expressions Java lambda en dehors de l'API Stream
[Java] Lors de l'écriture du source ... Mémorandum ①
Java: classe de gestion des jetons chronométrés pour l'authentification API Web
Liens pour chaque version (version japonaise) de l'API Java SE
Une vue d'ensemble du framework Java natif de Kubernetes Quarkus
Un mémorandum pour créer un enregistreur étendu à l'aide de org.slf4j.Logger
Une brève explication d'un jeu de labyrinthe fait à Java pour les cousins du primaire
Résumé des points que les programmeurs Java trouvent glissants lorsqu'ils lisent la source Kotlin pour la première fois