[JAVA] Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen

Wählen Sie nur das Web unter https://start.spring.io/ aus und erstellen Sie es schnell Ich hatte Swagger nicht und brachte es aus dem Maven Repository Die Version usw. finden Sie unter build.gradle.

Beispielcode https://github.com/ririkku/swagger-demo

Mindestkonfiguration zum Ausprobieren

Gesamtmenge an Code

build.gradle


plugins {
	id 'org.springframework.boot' version '2.2.1.RELEASE'
	id 'io.spring.dependency-management' version '1.0.8.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'

	//Minimum für Swagger erforderlich
	implementation "io.springfox:springfox-swagger2:2.9.2"
	implementation "io.springfox:springfox-swagger-ui:2.9.2"
	
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

SwaggerDemoApplication.java


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SwaggerDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SwaggerDemoApplication.class, args);
    }
}

SwaggerDemoConfiguration.java


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2 // swagger2.Verwenden Sie 0
public class SwaggerDemoConfiguration {

    @Bean
    public Docket petApi() {
        return new Docket(DocumentationType.SWAGGER_2) // Swagger2.Erklärung zur Verwendung von 0
                .select()
                .paths(PathSelectors.ant("/apis/**"))
                .build();
    }
}

SwaggerDemoRestController.java


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("apis")
public class SwaggerDemoRestController {

    @GetMapping
    public String get() {
        return "get";
    }
}

Bestätigung

Normalerweise beginne ich mit Intellij IDEA, aber einige Leute sind nicht in dieser Umgebung, also beginne ich mit Gradle ./gradlew bootRun Zugriff auf lokalen Host http://localhost:8080/swagger-ui.html (Da es nicht passte, wurde es in zwei Teile geteilt) スクリーンショット 2019-12-03 0.04.52.png スクリーンショット 2019-12-03 0.05.09.png

Verschiedene Gefühle

Benutzeroberfläche ist gut! !! !! Ich habe nicht viel Code geschrieben und es könnte praktisch sein Aber es fühlt sich viel Humor an, lassen Sie es uns ein wenig anpassen

Passen Sie Header-ähnliche Teile an

Code (Datei ändern)

SwaggerDemoConfiguration.java


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2 // swagger2.Verwenden Sie 0
public class SwaggerDemoConfiguration {

    @Bean
    public Docket petApi() {
        return new Docket(DocumentationType.SWAGGER_2) // Swagger2.Erklärung zur Verwendung von 0
                .select()
                .paths(PathSelectors.ant("/apis/**"))
                .build()
                .apiInfo(new ApiInfoBuilder()
                        .title("Customise Title Swagger Demo Application")
                        .description("Ich habe es nach meinen Wünschen angepasst")
                        .contact(new Contact("customise-name", "http://customise-contact", "customise-email"))
                        .version("1.0")
                        .termsOfServiceUrl("http://customise.com")
                        .license("Customise License").licenseUrl("http://customise-license-url") //Text, wenn nur Lizenz, Link, wenn licenseUrl gesetzt ist
                        .build());
    }
}

Bestätigung

スクリーンショット 2019-12-03 0.27.24.png

Verschiedene Gefühle

Die Stelle, an der das Suffix "Anpassen" neu geschrieben wurde Kann ich die Teile von "Basis-URL" und "http // localhost: 8080 / v2 / api-docs" ändern? Impressionen Außerdem können "Erweiterungen" in der "ApiInfoBuilder" -Klasse festgelegt werden Verwenden Sie es, wenn Sie Ihr eigenes Plug-In erstellen möchten? (https://swagger.io/docs/specification/2-0/swagger-extensions/) Nein, wie sieht die HTTP-Methode aus?

Überprüfen Sie die Benutzeroberfläche der HTTP-Methode

Code (Datei ändern)

SwaggerDemoRestController.java


import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("apis")
public class SwaggerDemoRestController {

    @GetMapping
    public String get() {
        return "get";
    }

    @PostMapping
    public void post() {
    }

    @DeleteMapping
    public void delete() {
    }

    @PutMapping
    public void put() {
    }

    @PatchMapping
    public void patch() {
    }
}

Bestätigung

Ich habe GET vor einiger Zeit gesehen, also fühle ich mich das nächste Mal wie POST スクリーンショット 2019-12-03 0.38.16.png スクリーンショット 2019-12-03 0.41.35.png

Verschiedene Gefühle

Bunt und leicht zu sehen (PATCH oder so) Es scheint, dass die Details der API auf verschiedene Weise berücksichtigt werden (Statuscode usw.) Als nächstes passen wir die Details an

Endpunktanpassung

Ich habe es mir anders überlegt und eine neue Klasse gegründet Absichtlich ist "@ PathVariable" an eine Klasse und "@ RequestParam" an einen String gebunden!

Code

Identifier.java


public class Identifier {

    private String value;

    public Identifier(String value) {
        this.value = value;
    }

    public String value() {
        if (value == null) return "";
        return value;
    }
}

SwaggerDemoCustomiseRestController.java


import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("apis/customise")
public class SwaggerDemoCustomiseRestController {

    @GetMapping("{identifier}")
    public String detail(@RequestHeader("X-Customise-Header") String customiseHeader,
                         @PathVariable("identifier") Identifier identifier,
                         @RequestParam(value = "name", required = false) String name,
                         @RequestParam("limit") int limit) {
        return identifier.value();
    }
}

Bestätigung

Ich habe versucht, "@ RequestHeader", "@ PathVariable", "@ RequestParam" zu setzen Obligatorische Dinge sind jetzt mit "erforderlich" gekennzeichnet, was praktisch ist.

スクリーンショット 2019-12-03 0.56.52.png

Übrigens, wenn Sie auf die Schaltfläche "Ausprobieren" klicken, wird die folgende Anzeige angezeigt, und Sie können den Wert eingeben und überprüfen!

スクリーンショット 2019-12-03 1.00.22.png

Durch Drücken von "Ausführen" werden "Curl", "URL anfordern", "ResponseCode", "ResponseBody", "ResponseHeaders" zurückgegeben!

スクリーンショット 2019-12-03 1.04.11.png スクリーンショット 2019-12-03 1.05.13.png

Verschiedene Gefühle

Sieht ziemlich praktisch aus Als nächstes beschränken wir den willkürlich generierten Antwortstatus auf das, was Sie wollen

Angeben des Antwortstatus

Durch Festlegen von "useDefaultResponseMessages" wird der Standardwert nur auf "200" gesetzt

Code (Datei ändern)

SwaggerDemoConfiguration.java


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2 // swagger2.Verwenden Sie 0
public class SwaggerDemoConfiguration {

    @Bean
    public Docket petApi() {
        return new Docket(DocumentationType.SWAGGER_2) // Swagger2.Erklärung zur Verwendung von 0
                .select()
                .paths(PathSelectors.ant("/apis/**"))
                .build()
                .useDefaultResponseMessages(false) // <-hinzufügen
                .apiInfo(new ApiInfoBuilder()
                        .title("Customise Title Swagger Demo Application")
                        .description("Ich habe es nach meinen Wünschen angepasst")
                        .contact(new Contact("customise-name", "http://customise-contact", "customise-email"))
                        .version("1.0")
                        .termsOfServiceUrl("http://customise.com")
                        .license("Customise License").licenseUrl("http://customise-license-url") //Text, wenn nur Lizenz, Link, wenn licenseUrl gesetzt ist
                        .build());
    }
}

Bestätigung

スクリーンショット 2019-12-03 1.11.07.png

Verschiedene Gefühle

Oshisuke verschwand Als nächstes definieren wir alle APIs der Fälle, die wahrscheinlich tatsächlich verwendet werden.

Praktische Endpunktdefinition

Ich möchte nur Swagger verwenden, damit der Verarbeitungsinhalt angemessen oder angemessen ist

Code

LessonIdentifier.java


class LessonIdentifier {

    private Integer value;

    LessonIdentifier(String value) {
        this.value = Integer.valueOf(value);
    }

    LessonIdentifier(int value) {
        this.value = value;
    }

    Integer value() {
        if (value == null) return 0;
        return value;
    }
}

LessonRequest.java


public class LessonRequest {

    private String studentName;
    private String tutorName;

    public LessonRequest(String studentName, String tutorName) {
        this.studentName = studentName;
        this.tutorName = tutorName;
    }

    public String getStudentName() {
        return studentName;
    }

    public String getTutorName() {
        return tutorName;
    }
}

LessonResponse.java


public class LessonResponse {

    private int id;
    private String studentName;
    private String tutorName;

    LessonResponse(int id, String studentName, String tutorName) {
        this.id = id;
        this.studentName = studentName;
        this.tutorName = tutorName;
    }

    public int getId() {
        return id;
    }

    public String getStudentName() {
        return studentName;
    }

    public String getTutorName() {
        return tutorName;
    }
}

LessonIdentifierResponse.java


public class LessonIdentifierResponse {

    private int value;

    LessonIdentifierResponse(LessonIdentifier lessonIdentifier) {
        this.value = lessonIdentifier.value();
    }

    public int getValue() {
        return value;
    }
}

ErrorResponse.java


public class ErrorResponse {

    private String message;

    public ErrorResponse(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

LessonController.java


import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("apis/lessons")
public class LessonController {

    @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class)
    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    public List<LessonResponse> list() {
        //Erwerbsprozess
        return Arrays.asList(
                new LessonResponse(1, "studentName1", "tutorName1"),
                new LessonResponse(2, "studentName2", "tutorName2"),
                new LessonResponse(3, "studentName3", "tutorName3"));
    }

    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @GetMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.OK)
    public LessonResponse detail(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
        //Erwerbsprozess
        return new LessonResponse(1, "studentName1", "tutorName1");
    }

    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public LessonIdentifierResponse add(@RequestBody LessonRequest lessonRequest) {
        //Zusätzliche Bearbeitung
        return new LessonIdentifierResponse(new LessonIdentifier(4));
    }

    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @DeleteMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void delete(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
        //Prozess löschen
    }

    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @PutMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.OK)
    public LessonResponse edit(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier,
                               @RequestBody LessonRequest lessonRequest) {
        //Bearbeitungsprozess
        return new LessonResponse(1, "EditStudentName1", "EditTutorName1");
    }
}

Bestätigung

Es gibt viele, also nur einige Example Value kam gut heraus Und nur die von ResponseStatus angegebenen!

スクリーンショット 2019-12-03 1.42.28.png スクリーンショット 2019-12-03 1.43.52.png スクリーンショット 2019-12-03 1.44.06.png

Verschiedene Gefühle

Ich bin an einem Punkt angelangt, an dem ich es gut nutzen kann Möchten Sie eine Erklärung der API schreiben? Also werde ich es schreiben

Detaillierte Beschreibung des Endpunkts

Ich habe versucht, "@ ApiOperation" hinzuzufügen

Code (Datei ändern)

LessonController.java


import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("apis/lessons")
public class LessonController {

    @ApiOperation(value = "Holen Sie sich eine Liste der Lektionen", notes = "Nehmen Sie alle Datensätze ohne Suchkriterien, um die Zeit in Ihrem Browser anzuhalten.")
    @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class)
    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    public List<LessonResponse> list() {
        //Erwerbsprozess
        return Arrays.asList(
                new LessonResponse(1, "studentName1", "tutorName1"),
                new LessonResponse(2, "studentName2", "tutorName2"),
                new LessonResponse(3, "studentName3", "tutorName3"));
    }

    @ApiOperation(value = "Holen Sie sich eine Lektion", notes = "ID指定したHolen Sie sich eine Lektion")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @GetMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.OK)
    public LessonResponse detail(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
        //Erwerbsprozess
        return new LessonResponse(1, "studentName1", "tutorName1");
    }

    @ApiOperation(value = "Erstellen Sie eine Lektion", notes = "Nach dem Erstellen wird die ID zurückgegeben!")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public LessonIdentifierResponse add(@RequestBody LessonRequest lessonRequest) {
        //Zusätzliche Bearbeitung
        return new LessonIdentifierResponse(new LessonIdentifier(4));
    }

    @ApiOperation(value = "Lektion löschen", notes = "Ich werde nichts zurückgeben")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @DeleteMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void delete(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
        //Prozess löschen
    }

    @ApiOperation(value = "Lektion bearbeiten", notes = "Gibt die bearbeitete Lektion zurück!")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @PutMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.OK)
    public LessonResponse edit(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier,
                               @RequestBody LessonRequest lessonRequest) {
        //Bearbeitungsprozess
        return new LessonResponse(1, "EditStudentName1", "EditTutorName1");
    }
}

Bestätigung

Details sind jetzt verfügbar!

スクリーンショット 2019-12-03 1.52.23.png スクリーンショット 2019-12-03 1.52.35.png

Verschiedene Gefühle

Ich mag es jedoch nicht, wenn die in @ ApiOperation oder @ ApiResponse geschriebenen Nachrichten zu lang werden. .. .. Ich werde es versuchen, indem ich mich frage, ob es in eine separate Datei umgewandelt werden kann

Definieren Sie die Nachricht in einer separaten Datei

Code

application.properties


LessonController.list.value=Holen Sie sich eine Liste der Lektionen
LessonController.list.notes=Stoppen Sie die Zeit in Ihrem Browser, indem Sie alle Datensätze ohne Suchkriterien aufnehmen

LessonController.detail.value=Holen Sie sich eine Lektion
LessonController.detail.notes=Holen Sie sich die Lektion mit der angegebenen ID

LessonController.add.value=Erstellen Sie eine Lektion
LessonController.add.notes=Nach dem Erstellen wird die ID zurückgegeben!

LessonController.delete.value=Lektion löschen
LessonController.delete.notes=Ich werde nichts zurückgeben

LessonController.edit.value=Lektion bearbeiten
LessonController.edit.notes=Gibt die bearbeitete Lektion zurück!

LessonController.java


import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("apis/lessons")
public class LessonController {

    @ApiOperation(value = "${LessonController.list.value}", notes = "${LessonController.list.notes}")
    @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class)
    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    public List<LessonResponse> list() {
        //Erwerbsprozess
        return Arrays.asList(
                new LessonResponse(1, "studentName1", "tutorName1"),
                new LessonResponse(2, "studentName2", "tutorName2"),
                new LessonResponse(3, "studentName3", "tutorName3"));
    }

    @ApiOperation(value = "${LessonController.detail.value}", notes = "${LessonController.detail.notes}")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @GetMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.OK)
    public LessonResponse detail(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
        //Erwerbsprozess
        return new LessonResponse(1, "studentName1", "tutorName1");
    }

    @ApiOperation(value = "${LessonController.add.value}", notes = "${LessonController.add.notes}")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public LessonIdentifierResponse add(@RequestBody LessonRequest lessonRequest) {
        //Zusätzliche Bearbeitung
        return new LessonIdentifierResponse(new LessonIdentifier(4));
    }

    @ApiOperation(value = "${LessonController.delelte.value}", notes = "${LessonController.delete.notes}")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @DeleteMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void delete(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
        //Prozess löschen
    }

    @ApiOperation(value = "${LessonController.edit.value}", notes = "${LessonController.edit.notes}")
    @ApiResponses(value = {
            @ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
            @ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
    @PutMapping("{lessonIdentifier}")
    @ResponseStatus(HttpStatus.OK)
    public LessonResponse edit(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier,
                               @RequestBody LessonRequest lessonRequest) {
        //Bearbeitungsprozess
        return new LessonResponse(1, "EditStudentName1", "EditTutorName1");
    }
}

Bestätigung

Lass uns ohne Probleme raus!

スクリーンショット 2019-12-03 2.16.51.png

Verschiedene Gefühle

Dies ist sehr praktisch, wenn Sie Nachrichten in einer Datei kombinieren möchten Wenn Sie es jedoch nicht übertreiben, handelt es sich in der Regel um eine komplizierte Nachrichtendatei. Seien Sie also vorsichtig, wenn Sie sie verwenden.

Zusammenfassung

Ich habe verstanden, dass es vorerst bequem zu sein scheint Es gibt jedoch einige Teile, die ich nicht untersuchen konnte, z. B. nach dem Erstellen oder wenn ich nicht möchte, dass die Produktionsumgebung auf swagger-ui zugreift, sodass ich später nachforschen werde.

Referenz

https://springfox.github.io/springfox/docs/current/

Recommended Posts

Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Geben Sie die statische Ressourcencodierung in Spring Boot an
Greifen Sie mit jdbcTemplate auf das integrierte h2db des Spring Boot zu
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Überprüfen Sie das Verhalten von include, exclude und ExhaustedRetryException von Spring Retry
Überprüfen Sie das Verhalten von getOne-, findById- und Abfragemethoden mit Spring Boot + Spring Data JPA
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Lassen Sie uns das Betriebsbild (Atmosphäre) des DI-Containers von Spring erfassen
Spring Boot zum ersten Mal
[Schienen] Überprüfen Sie den Inhalt des Objekts
Nachricht erlöschen (Spring Boot)
Überprüfen Sie den Migrationsstatus von Schienen
Filtern Sie das Ergebnis von BindingResult [Spring]
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Sehen Sie sich das Verhalten von Entitätsaktualisierungen mit Spring Boot + Spring Data JPA an
Ich möchte die Standardfehlermeldung von Spring Boot steuern
[Anfänger] Versuchen Sie, die REST-API für die Todo-App mit Spring Boot zu schreiben
Die Geschichte der Begegnung mit Spring Custom Annotation
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Überprüfen Sie den Inhalt der Parameter mit pry
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
HTTPS mit Spring Boot und Let's Encrypt
Informationen zur ersten Anzeige von Spring Framework
WebMvcConfigurer-Memorandum von Spring Boot 2.0 (Spring 5)
Überprüfen Sie die Version der Standard-Web-Software.
[Java] Überprüfen Sie die Anzahl der Zeichen
[Java] [Spring] Testen Sie das Verhalten des Loggers
Überprüfen Sie die Funktion der Schnittstelle über den Thread
Einführung des Spring Boot Actuator, einer Funktion, die die Bedienung von Spring Boot-Anwendungen erleichtert
So überprüfen Sie die neueste Version von io.spring.platform für das Schreiben in pom.xml von Spring (STS)
Organisieren Sie die Unterschiede im Verhalten von @NotBlank, @NotEmpty und @NotNull mit Spring Boot + Thymeleaf
Ruft den Klassennamen und den Methodennamen des Controllers ab, der vom HandlerInterceptor von Spring Boot ausgeführt wird
Rufen Sie den in der Controller-Klasse von Spring Boot definierten Pfad als Liste ab
Ressourcenhandler-Einstellungen bei der Bereitstellung von SPA mit der statischen Ressourcenfunktion von Spring Boot
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
Was ist JSP? ~ Lassen Sie uns die Grundlagen von JSP kennen !! ~
Überprüfen Sie die installierte und aktivierte JDK-Version
Über den offiziellen Startleitfaden für Spring Framework
[FCM] Implementierung der Nachrichtenübertragung mit FCM + Spring Boot
Spüren Sie den Lauf der Zeit auch in Java
Verschiedene Korrespondenztabellen zwischen Spring Framework und Spring Boot
Wenn @Transactional of Spring Boot nicht funktioniert
Der offizielle Name von Spring MVC ist Spring Web MVC
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
[Überprüfung] Vergleich der Spring Boot- mit der Micronaut-Boot-Geschwindigkeit
[Vergleichsüberprüfung] Wie unterschiedlich ist die Entwicklungsproduktivität der Spring Boot-App von der Vergangenheit?
Fordern Sie Spring Boot heraus
Lassen Sie uns einen Leistungsschalter für den Backend-Service mit Actuator of Spring Boot (Teil 1) herstellen.
[Spring Boot] Die Geschichte, dass die Bean der Klasse mit der Annotation ConfigurationProperties nicht gefunden wurde
Spring Boot Form
Spring Boot Denken Sie daran