Micro Architecture Services des articles réels (B): Spring boot2.0 + Swagger2 visualisation API

brève introduction

Le projet utilisera printemps boot2.0 + Swagger2 faciliter forme de test reposant l'arrière-plan de l'interface, mise à jour dynamique, lorsque nous modifions l'interface en arrière-plan, démarche assurée peut réaliser la mise à jour automatique, sans penser à maintenir cette interface les tests.

  • Adresse Source
  • GitHub: https: //github.com/yundianzixun/spring-boot-starter-swagger2
  • Union Numéro public: combattre Alliance
  • Notre communauté: https: //100boot.cn

Un gadget, bienvenue et soutenir l'étoile, comme au cours de rencontrer des problèmes, proposer problème, je vais essayer d'améliorer le démarrage

version de base

  • Boot Spring: 2.0.4
  • Swagger2: 2.7.0

mesures

Première étape: Télécharger le projet de SpringBoot2.0
  • Adresse GitHub: https: //github.com/yundianzixun/spring-boot-starter
  • Document de référence: https: //www.jianshu.com/p/7dc2240f010e
Deuxième étape: Ajouter dépendante maven   < dépendance > < groupId > io.springfox < / GroupId > < artifactId > springfox-swagger2 < / ArtifactId > < version > 2.7.0 < / version > < / dépendance > < dépendance > < groupId > io.springfox < / GroupId > < artifactId > springfox-fanfaronnades-ui < / ArtifactId > < version > 2.7.0 < / version > < / dépendance > < dépendance > < groupId > org.apache.tomcat.embed < / GroupId > < artifactId > tomcat-embed-jasper < / ArtifactId > < / dépendance > < ! - frappé par le paquet de guerre - > < dépendance > < groupId > org.springframework.boot < / GroupId > < artifactId > printemps-boot-démarreur-tomcat < / ArtifactId > < portée > à condition que < / Champ d'application > < / dépendance > < dépendance > < groupId > org.springframework.boot < / GroupId > < artifactId > printemps-boot-démarreur Web < / ArtifactId > < / dépendance > La troisième étape: application.properties augmentation configuration fanfaronnades # Activer le service de fanfaronnades swagger.enable = true Quatrième étape: utiliser les annotations configuration Swagger @Configuration @ EnableSwagger2 public class {Swagger2Config public static finale chaîne BASE_PACKAGE = "com.itunion"; @Value ( "$ {} swagger.enable") enableSwagger private boolean; @Bean publique Docket createRestApi () { retour nouvelle Docket (DocumentationType.SWAGGER_2) .apiInfo (apiInfo ()) // environnement de production plus en sécurité quand fanfaronnades fermé .enable (enableSwagger) // Type Timestamp sera entièrement converti en type long .directModelSubstitute (Timestamp.class, Long.class) // sera converti en type long Date Type Tous .directModelSubstitute (Date.class, Long.class) .select () // interface de numérisation de chemin package, ne pas oublier de changer leur .apis (RequestHandlerSelectors.basePackage (BASE_PACKAGE)) .paths (PathSelectors.any ()) .build (); } Private ApiInfo apiInfo () {return new ApiInfoBuilder () .title ( "API RESTful Swagger") .description ( "API Swagger Service") .termsOfServiceUrl ( " .Contact (nouveau contact ( "Swagger", "127.0.0.1", "zhenghhgz@163.com")) .version ( "1.0"), .build (); } }

remarque

  • Une fois l'élément de ligne normale doit être fermé fanfaronnades, alors voici ajoute une enableSwagger de configuration
  • Vous pouvez utiliser directModelSubstitute devrait faire une conversion de type
Cinquième étape: Créer une classe d'entités utilisateur UserInfo public class {UserInfo @ApiModelProperty ( "Non") privé id long; @ApiModelProperty ( "nom d'utilisateur") private String userName; @ApiModelProperty ( "name") private String prenom; @ApiModelProperty ( "name") private String lastName; @ApiModelProperty ( "boîte aux lettres") privé Chaîne e-mail; @ApiModelProperty (caché = true) // mot de passe ne sont pas transmis @JsonIgnore privé mot de passe de chaîne; @ApiModelProperty ( "state") Entier UserStatus privé; / ** s'omis ici, ensemble ** / } Sixième étape: Ecrire une page de contrôleur @Api (valeur = "Home", description = "Home") @RequestMapping ( "/") @RestController public class {IndexController @ApiOperation (valeur = "Bonjour Spring Boot", notes = "Bonjour Spring Boot") @RequestMapping (value = "/", méthode = RequestMethod.GET) index public String () { retour « Bonjour printemps Boot »; } @ApiOperation (valeur = "page API", note = "Interface List") @RequestMapping (value = "/ api", méthode = RequestMethod.GET) api public void (réponse HttpServletResponse) throws IOException { response.sendRedirect ( "fanfaronnades-ui.html"); } }
  • Pour faciliter l'accès à la page fanfaronnades ui, nous faisons une redirection plus pratique api
Septième étape: Ecrire un atterrissage contrôleur @Api (valeur = "Utilisateur", description = "Utilisateur") @RequestMapping ( "/ userInfo") @RestController public class {UserInfoController @ApiOperation (valeur = « L'interface de connexion - à valeurs multiples en termes de valeur », note = « entrer un nom d'utilisateur et mot de passe ») @ApiResponses (valeur = { @ApiResponse (code = 200, message = "OK", réponse = UserInfo.class, responseContainer = "userInfo"), @ApiResponse (code = 405, message = "nom de compte ou mot de passe est incorrect") }) @ApiImplicitParam (name = "carte", value = "{\" nomUtilisateur \ ": \" JackMa \ "\" passWord \ ": \" 123 \ "}") @RequestMapping (value = "loginForMap", méthode = RequestMethod.POST, produit = MediaType.APPLICATION_JSON_UTF8_VALUE) ResponseEntity < UserInfo >  loginForMap (Carte @RequestBody < String, String >  carte) { if (! map.get ( "nomUtilisateur"). equalsIgnoreCase ( "JackMa") ||! map.get ( "MotDePasse"). equalsIgnoreCase ( "123")) { retour ResponseEntity.status (HttpStatus.METHOD_NOT_ALLOWED) .build (); } UserInfo utilisateur = new UserInfo (); user.setId (1L); user.définitNomUtil ( "JackMa"); user.setFirstName ( "MA"); user.setLastName ( "nuage"); user.setEmail ( "zhenghhgz@163.com"); user.setUserStatus (1); retour ResponseEntity.ok (utilisateur); } @ApiOperation (valeur = "L'interface de connexion - mode de transmission à plusieurs niveaux", notes = "entrer un nom d'utilisateur et mot de passe") @ApiResponses (valeur = { @ApiResponse (code = 200, message = "OK", réponse = UserInfo.class, responseContainer = "userInfo"), @ApiResponse (code = 405, message = "nom de compte ou mot de passe est incorrect") }) @ApiImplicitParams ({ @ApiImplicitParam (name = "userName", value = "nom d'utilisateur", nécessaire = true, dataType = "string", typeParam = "requête"), @ApiImplicitParam (name = "PASSWORD", value = "mot de passe", nécessaire = true, dataType = "string", typeParam = "requête"), }) @RequestMapping (value = "loginForParams", méthode = RequestMethod.POST, produit = MediaType.APPLICATION_JSON_UTF8_VALUE) ResponseEntity < UserInfo >  loginForMap (@RequestParam chaîne userName, @RequestParam chaîne passWord) { if (! userName.equalsIgnoreCase ( "JackMa") ||! passWord.equalsIgnoreCase ( "123")) { retour ResponseEntity.status (HttpStatus.METHOD_NOT_ALLOWED) .build (); } UserInfo utilisateur = new UserInfo (); user.setId (1L); user.définitNomUtil ( "JackMa"); user.setFirstName ( "MA"); user.setLastName ( "nuage"); user.setEmail ( "jackma@163.com"); user.setUserStatus (1); retour ResponseEntity.ok (utilisateur); } }

remarque

  • Params et réalisé au moyen de deux transmissions de données Param différent
  • Nous avons recommandé type printemps résultats de retour Unify ResponseEntity
  • fanfaronnades assez bon code de réponse de soutien, nous pouvons mettre un code d'exception qui peuvent survenir sont tous entrepris de faciliter le temps d'accostage de la gestion des exceptions
Huitième étape: Commencez à courir

remarque

  • le numéro de port a sa propre configuration prend

Comme indiqué ci-dessous:

swagger2.jpg Etape 9: exécution

Entrez .jpg

sortie .jpg

Collaborateurs

  • IT Alliance -ligne combat
  • combattre Alliance - Café
Plus de contenu passionnant peut se concentrer sur "IT Alliance de combat" Oh ~ ~ ~

L'histoire de la plus grande fusion de l'industrie de la technologie contre-attaque « de dernière minute », les actionnaires de Qualcomm sera retardée d'un mois
Précédent
2019EC ski centrale européenne Alliance Cervin (Zermatt) compétition de ski chinoise un succès
Prochain
Hengda patron Xu Inde à la maison aux parents de visite, de faire un don de 650 millions pour la charité
Ligue des Champions - Di Bala tradition co Ewing 4-3 Jésus pause huit derniers Manchester coupe score total 5-2
Lu Shu Zhao Zhenjiang Award interview traducteur: "Don Quichotte" Il y a des centaines de traduction en chinois et "Dream of Red Mansions" a été seulement une version espagnole
monnaie de cryptage ne causera pas un « risque considérable », mais marquera le début d'une liquidation brutale
Fatigué de regarder projet de plats à emporter? Départ de la charité FCE, et la distribution des emballages alimentaires finis pour les familles nécessiteuses
applet lettre Micro vibrato combat - support pour les petits téléphones mobiles pour lire la vidéo
Lu Prix interview de traducteur avec le professeur Shu Zhao Zhenjiang Nord: « ne pas écrire la poésie, » le poète a passé quatre ans traduire « Dream of Red Mansions » avec l'espagnol
La Liga: Séville Zhanla Girona, Betis triomphe sous-marin jaune était absolument plat
Architecture articles réels (xiv): multi-cache de combat Spring Boot (avec le code source GitHub)
plus plusieurs marché unique au monde
19 pays et régions 2018 athlètes ont participé à Panzhihua début Canoe Marathon international
Les enseignants de la classe à conseiller les étudiants à « numéro d'appel », émis le numéro 50 hebdomadaire d'une « prescription »