Hallo Welt mit Google App Engine (Java 8) + Spring Boot + Gradle

Überblick

--Erstellen Sie eine einfache Hello World-Display-Webanwendung mit der Java 8-Standardumgebung von Google App Engine + Spring Boot-Konfiguration

Umgebung

Quellcode

Quellcodeliste

├── build.gradle
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── helloworld
    │   │               ├── HelloworldApplication.java
    │   │               ├── HelloworldController.java
    │   │               ├── HelloworldErrorController.java
    │   │               └── HelloworldServletInitializer.java
    │   ├── resources
    │   │   ├── application.yml
    │   │   ├── static
    │   │   │   └── assets
    │   │   │       └── helloworld.png
    │   │   └── templates
    │   │       ├── error.html
    │   │       └── helloworld.html
    │   └── webapp
    │       └── WEB-INF
    │           └── appengine-web.xml
    └── test
        └── java
            └── com
                └── example
                    └── helloworld
                        └── HelloworldApplicationTests.java

build.gradle

Eine Datei, die den Prozess zum Erstellen in Gradle beschreibt. Das Gradle-Plugin von Google App Engine verwendet die Serie 2.

build.gradle


buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    //Verwenden Sie das Spring Boot Gradle Plugin
    classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.2.0.RELEASE'
    //Verwenden Sie das Google App Engine Gradle-Plugin
    classpath 'com.google.cloud.tools:appengine-gradle-plugin:2.2.0'
  }
}

plugins {
  //Einführung des Java-Plug-Ins
  id 'java'
  //Einführung des War Plug-Ins
  id 'war'
  // https://plugins.gradle.org/plugin/org.springframework.boot
  id 'org.springframework.boot' version '2.2.0.RELEASE'
  // https://plugins.gradle.org/plugin/io.spring.dependency-management
  id 'io.spring.dependency-management' version '1.0.8.RELEASE'
}

//App Engine Plug-In eingeführt
apply plugin: 'com.google.cloud.tools.appengine'

repositories {
  mavenCentral()
}

dependencies {
  //Neueste Version der App Engine API
  implementation 'com.google.appengine:appengine-api-1.0-sdk:+'
  // Thymeleaf
  implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
  // Spring Web
  implementation 'org.springframework.boot:spring-boot-starter-web'
  //Der integrierte Tomcat wird bei der Bereitstellung nicht verwendet
  providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
  // Test
  testImplementation('org.springframework.boot:spring-boot-starter-test') {
    //Schließen Sie die Unterstützung für JUnit 4 aus
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
  }
}

test {
  //Aktivieren Sie die Unterstützung für JUnit 5
  useJUnitPlatform()

  testLogging {
    //Anzeige der Standardausgabe und der Standardfehlerausgabe während des Tests
    showStandardStreams true
    //Ausgabeereignis(TestLogEvent)
    events 'started', 'skipped', 'passed', 'failed'
  }
}

//ID und Version der Webanwendungsgruppe
group   = "com.example.helloworld"
version = "0.0.1"

//Verwenden Sie Java 8
sourceCompatibility = '1.8'
targetCompatibility = '1.8'

//Aufgabeneinstellungen für Google App Engine
appengine {
  //Bereitstellungseinstellungen
  // GCLOUD_Wenn Sie CONFIG angeben
  //Die in der gcloud-Konfiguration festgelegten Projektinformationen werden festgelegt
  deploy {
    //Stellen Sie die Ziel-Google Cloud-Projekt-ID bereit
    projectId = "GCLOUD_CONFIG"
    //Web-App-Version, die sich in der Bereitstellung widerspiegelt
    //Wenn nicht angegeben, wird eine neue generiert
    version = "GCLOUD_CONFIG"
  }
}

//Führen Sie vor der Bereitstellung Tests aus
appengineDeploy.dependsOn test
appengineStage.dependsOn test

Referenz:

settings.gradle

Wenn Sie settings.gradle nicht festlegen, wechseln Sie in das übergeordnete Verzeichnis, um settings.gradle zu finden. Fügen Sie es also auch in ein einzelnes Projekt ein.

settings.gradle


rootProject.name = 'helloworld'

HelloworldApplication.java

Anwendungsklasse. Ich schreibe nur die Routineverarbeitung für die Verwendung von Spring Boot.

package com.example.helloworld;

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

@SpringBootApplication
public class HelloworldApplication {

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

HelloworldController.java

Controller-Klasse.

package com.example.helloworld;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloworldController {

  /**
   * application.Nachricht von yml erhalten.
   */
  @Value("${application.message}")
  private String applicationYamlMessage;

  /**
   *Gibt die Antwort der oberen Seite zurück.
   *
   * @Informationen zur Seitenanzeige zurückgeben
   */
  @GetMapping("/")
  public ModelAndView index() {

    System.out.println("HelloworldController#index");

    //Wird aus Systemeigenschaften erhalten
    String systemPropertyMessage = System.getProperty("com.example.helloworld.message");

    //Stellen Sie die anzuzeigenden Daten ein
    ModelAndView mav = new ModelAndView();
    mav.addObject("systemPropertyMessage", systemPropertyMessage);
    mav.addObject("applicationYamlMessage", applicationYamlMessage);
    mav.setViewName("helloworld"); //Name anzeigen. Geben Sie die Thymeleaf-Vorlagendatei an

    return mav;
  }

  /**
   *Eine Testmethode, die eine Fehlerseite anzeigt.
   */
  @GetMapping("/exception/")
  public void exception() {
    System.out.println("HelloworldController#exception");
    throw new RuntimeException("This is a sample exception.");
  }
}

HelloworldErrorController.java

Fehlercontroller-Klasse für die gesamte Webanwendung. Es verarbeitet Nicht gefunden usw., die von einer allgemeinen Controller-Klasse nicht erfasst werden können. Hier wird nur die Mindestverarbeitung beschrieben, die Sie jedoch nach Bedarf anpassen können.

package com.example.helloworld;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

/**
 *Fehlercontroller für die gesamte Webanwendung.
 *Eine Implementierungsklasse für die ErrorController-Schnittstelle.
 */
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}") //Zuordnung zur Fehlerseite
public class HelloworldErrorController implements ErrorController {

  /**
   *Fehlerseitenpfad.
   */
  @Value("${server.error.path:${error.path:/error}}")
  private String errorPath;

  /**
   *Gibt den Pfad der Fehlerseite zurück.
   *
   * @Rückgabe des Fehlerseitenpfads
   */
  @Override
  public String getErrorPath() {
    return errorPath;
  }

  /**
   *Gibt ein ModelAndView-Objekt für die Antwort zurück.
   *
   * @param req Anforderungsinformationen
   * @param mav Antwortinformationen
   * @ModelAndView-Objekt für die Rückgabe einer HTML-Antwort
   */
  @RequestMapping
  public ModelAndView error(HttpServletRequest req, ModelAndView mav) {

    System.out.println("HelloWorldErrorController#error");

    //404 Für keinen Fehler gefunden
    //Der Statorcode und der Ausgabeinhalt können nach Bedarf angepasst werden.
    HttpStatus status = HttpStatus.NOT_FOUND;
    mav.setStatus(status);
    mav.setViewName("error"); // error.html
    return mav;
  }
}

HelloworldServletInitializer.java

WebApplicationInitializer-Implementierungsklasse, die für die Umgebung erforderlich ist, in der die WAR-Datei bereitgestellt und betrieben wird. Für Google App Engine muss diese Klasse WAR-Dateien bereitstellen und ausführen.

package com.example.helloworld;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class HelloworldServletInitializer extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    System.out.println("HelloworldServletInitializer#configure");
    return application.sources(HelloworldApplication.class);
  }
}

Referenz: [SpringBootServletInitializer \ (Spring Boot Docs 2 \ .2 \ .0 \ .RELEASE API )](https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/api/org/ springframework / boot / web / servlet / support / SpringBootServletInitializer.html)

application.yml

Eine Datei, die Informationen zu Webanwendungseinstellungen beschreibt. Es können auch application.properties sein. Dieses Mal werden nur die für die Anwendung eindeutigen Informationen festgelegt.

application:
  message: Hello, application yaml.

helloworld.png

Ein als Beispiel platziertes Bild, das den statischen Dateispeicher zeigt. Wenn Sie die statische Datei in src / main / resources / static ablegen, wird sie http: // hostname / zugeordnet. Wenn Sie diesmal auf http: //hostname/assets/helloworld.png zugreifen, wird die Datei src / main / resources / static / assets / helloworld.png bereitgestellt.

error.html

HTML Thymeleaf-Vorlagendatei, die angezeigt wird, wenn ein Fehler auftritt. Diesmal ist der dynamische Wert nicht eingebettet, es ist jedoch möglich, den Wert in der Fehlercontrollerklasse nach Bedarf festzulegen und so anzupassen, dass er auf der Vorlagenseite angezeigt wird.

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
</body>
</html>

helloworld.html

Eine HTML-Thymeleaf-Vorlagendatei zum Anzeigen der von der Controller-Klasse festgelegten Werte.

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Hello, world.</title>
</head>
<body>
<h1>Hello, world.</h1>
<div th:text="'System Property: ' + ${systemPropertyMessage}"></div>
<div th:text="'application.yml: ' + ${applicationYamlMessage}"></div>
<div><img src="./assets/helloworld.png "></div>
</body>
</html>

appengine-web.xml

Konfigurationsdatei für Google App Engine. Beschreiben der Informationen der Webanwendung.

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">

  <!-- Java VM -->
  <runtime>java8</runtime>

  <!--Gewindesichere Einstellung-->
  <threadsafe>true</threadsafe>

  <!--Autoscale-Einstellung für die Anzahl der Instanzen-->
  <automatic-scaling>
    <!--Starten Sie eine neue Instanz, wenn der hier angegebene CPU-Auslastungsfaktor überschritten wird-->
    <target-cpu-utilization>0.95</target-cpu-utilization>
    <!--Mindestanzahl von Instanzen. Wenn auf 0 gesetzt, ist die Anzahl der Instanzen 0, wenn sie nicht verwendet werden.-->
    <min-instances>0</min-instances>
    <!--Maximale Anzahl von Instanzen-->
    <max-instances>1</max-instances>
    <!--Zulässige Anzahl gleichzeitiger Anfragen-->
    <max-concurrent-requests>80</max-concurrent-requests>
  </automatic-scaling>

  <!--Statische Datei-->
  <static-files>
    <include path="/assets/**.*"/>
  </static-files>

  <!--Systemeigenschaften aktiviert, wenn sie in Google App Engine oder mit gradle appengineRun ausgeführt werden-->
  <system-properties>
    <property name="com.example.helloworld.message" value="Hello, system property."/>
  </system-properties>
</appengine-web-app>

Referenz: appengine-web.XML-Referenz|Java 8 App Engine-Standardumgebung|  Google Cloud

HelloworldApplicationTests.java

Minimale Testklasse. Es werden nur formale Dinge beschrieben. Testet eigentlich nichts.

package com.example.helloworld;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class HelloworldApplicationTests {

  @Test
  void contextLoads() {
  }
}

Operation

Führen Sie den Test aus

Sie können den Test mit der Gradle-Testaufgabe ausführen.

$ gradle test 

Starten Sie den Server lokal mit gradle appengineRun

Sie können den lokalen Server http: // localhost: 8080 / mit gradle appengineRun starten.

$ gradle appengineRun

Bereitstellung mit gradle appengineDeploy in Google App Engine

Kann mit gradle appengineDeploy in Google App Engine bereitgestellt werden.

$ gradle appengineDeploy

Andere

Die webanwendungsweite Fehlerbehandlung gilt nicht

In einigen Fällen verwendet der Fehlercontroller keine eigene Fehlerbehandlung.

Deskriptor bereitstellen: web.xml  |Java 8 App Engine-Standardumgebung|  Google Cloud

Hinweis: Derzeit können benutzerdefinierte Fehlerbehandlungsroutinen für einige Fehlerbedingungen nicht konfiguriert werden. Insbesondere können Sie die HTTP 404-Antwortseite nicht anpassen, wenn für eine bestimmte URL keine Servlet-Zuordnung definiert ist. Sie können auch die Seite "403 Allocation Error" oder die Seite "500 Server Error", die aufgrund eines internen App Engine-Fehlers angezeigt wird, nicht anpassen.

Als ich es tatsächlich versuchte, 404 Nicht gefunden war nicht meine eigene Anpassung auf dem Server, den ich lokal mit gradle appengineRun eingerichtet habe. Die mit gradle appengineDeploy für Google App Engine bereitgestellte Version zeigte ihre eigene angepasste 404 Not Found an.

Referenzmaterial

Recommended Posts

Hallo Welt mit Google App Engine (Java 8) + Spring Boot + Gradle
Hallo Welt mit Google App Engine (Java 11) + Spring Boot + Gradle
Hallo Welt mit Google App Engine (Java 8) + Servlet API 3.1 + Gradle
Google AppEngine-Entwicklung mit Docker
Java 1 1-Unterstützung von Google App Engine
Erstellen einer Entwicklungsumgebung mit Maven in Google App Engine [Java]
Verwenden der Eigenschaftendatei mit Flexible Environment Java 8 von Google App Engine
Ich kann nicht mehr mit der Google App Engine bereitstellen
Hallo Welt mit ctypes
Hallo, Welt mit Docker
Hallo Welt auf Flasche
PIL in Python unter Windows8 (für Google App Engine)
Erste Schritte mit Google App Engine für Python und PHP
Zeichne Hallo Welt mit mod_wsgi
Hallo Welt mit Flask + Hamlish
Bis hallo Welt mit Zappa
Ich habe versucht, mich mit Spring Boot + Spring Security REST API anzumelden
Stellen Sie Go-Apps mit GitHub-Aktionen für Google App Engine bereit
Python beginnend mit Hallo Welt!
Hallo Welt! Mit virtueller CAN-Kommunikation
[Hinweis] Hallo Weltausgabe mit Python
Verwenden Sie ndb.tasklet mit Google App Engine
Hallo Welt! Von QPython mit Braincrash
Hallo Welt- und Gesichtserkennung mit opencv-python 4.2
Java-Deploy Spring Boot-Projekt für GAE
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Greifen Sie mit Spring Boot auf Azure Cosmos DB zu
[Python] Führen Sie Flask in Google App Engine aus
[Google App Engine] Benutzerobjekte (japanische Übersetzung)
Verwenden Sie externe Module mit Google App Engine
Hallo Welt! Von QPython mit Brainfu * k
Ich habe Java8 + Spring Boot mit GAE SE (und seiner Entwicklungsumgebung) ausprobiert.
Eine Web-App, die Hello World nur mit dem net / http-Paket von Go ausführt