Spring Boot a Spring Data – vygenerování DDL skriptu

Pokud ve svém projektu používá Spring Boot a Spring Data, stačí pro vytváření tabulek do application.properties umístit:

spring.jpa.hibernate.ddl-auto=create

Při každém startu aplikace se znovu vytvoří tabulky a další potřebné objekty. To se hodí, když aplikaci vyvíjíte a často děláte změny.

Pokud potřebujete samostatný DDL skript (například pro prvotní vytvoření tabulek na serveru, kam budete nasazovat), stačí do application.properties přidat:

spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql

Tímto se v adresáři projektu vygeneruje soubor create.sql s potřebnými SQL příkazy.

Zdroj: stackoverflow.com/…-spring-boot-data-jpa-and-h

Vaadin a Spring Boot – vytvoření projektu

Když vytvořím projekt z STS jako Spring Starter Project, po spuštění se mi ukáže v prohlížeči tento text:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sun Dec 17 12:53:44 CET 2017
There was an unexpected error (type=Not Found, status=404).
No message available

Totéž se stane, pokud si nechám identický projekt vytvořit přes http://start.spring.io/. Je třeba si v projektu vytvořit UI.

import com.vaadin.server.VaadinRequest;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;

@SpringUI
public class VaadinUI extends UI {

	@Override
	protected void init(VaadinRequest request) {
		setContent(new Label("Hello World"));
	}

}

Nyní po spuštění (Run As -> Spring Boot App) dostanu tuto stránku:

vaadin-spring-boot-vytvoreni-projektu

Spring Boot a Spring Batch – jednoduchý job

V tomto příspěvku budeme pokračovat v tomto projektu. Aktuálně máme prázdny projekt v Eclipse IDE, který lze spustil. Přidáme si do něj jednoduchý job, který bude mazat soubor. Pro definování nových tříd (beans) použijeme java configuraci.

BeanConfig.java

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import cz.vitfo.batch.processing.DeleteFileTasklet;

@Configuration
@EnableBatchProcessing
@ComponentScan("cz.vitfo")
public class BeanConfig {

	@Autowired
	private JobBuilderFactory jobBuilderFactory;
	
	@Autowired
	private StepBuilderFactory stepBuilderFactory;
	
	@Autowired
	private DeleteFileTasklet deleteFileTasklet;
	
	@Bean	
	public Job myJob() {
		return jobBuilderFactory.get("myJob")
			.start(deleteFileFromDirectoryStep())
			.build();
	}
	
	@Bean
	public Step deleteFileFromDirectoryStep() {
		return stepBuilderFactory.get("deleteFileFromDirectoryStep")
			.tasklet(deleteFileFromDirectoryTasklet())
			.build();
	}
	
	@Bean
	public Tasklet deleteFileFromDirectoryTasklet() {
		return deleteFileTasklet;
	}
}
  • Anotace @Configuration označuje tuto třídu jako tu, která obsahuje jednu nebo více anotací @Bean. Pokud na tuto anotaci Spring narazí, vytvoří beanu (třídu) dle definice. Zkráceně řečeno anotace @Configuration označuje třídu, kde se nachází konfigurace.
  • Anotace @EnableBatchProcessing za nás vytvoří a inicializuje beany (třídy) jako například JobBuilderFactory nebo StepBuilderFactory, které budeme používat pro vytvoření jobu.
  • Anotace @ComponentScan říká Springu, kde má hledat třídy, ze kterých má vytvořit beany. Spring pak prochází zadanou cestu a hledá třídy s anotacemi.

Číst dálSpring Boot a Spring Batch – jednoduchý job

Spring Boot a Spring Batch – vytvoření projektu

V tomto příspěvku si vytvoříme Spring Boot projekt se Spring Batch. V dalších číslech pak budeme s tímto projektem pokračovat. Nejdříve si nechte vygenerovat projekt pomocí Spring Initializr. Přidejte závislost na Batch.

spring_boot_batch_initializr

Stáhněte si zip s vygenerovaným projektem, rozbalte jej a naimportujte do Eclipse IDE (File -> Import… -> Maven -> Existing Maven Projects -> najít rozbalený projekt -> Finish). Projekt spusťte (pravým na projekt -> Run As -> Java Application, nebo pokud používáte STS tak Spring Boot App). Měli byste dostat následující chybu:

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-09-05 13:49:01.364 ERROR 14088 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   :

***************************
APPLICATION FAILED TO START
***************************

Description:

Cannot determine embedded database driver class for database type NONE

O této chybě již byla řeč v tomto příspěvku. Přidejte tedy do pomu závislost:

<dependency>
	<groupId>org.hsqldb</groupId>
	<artifactId>hsqldb</artifactId>
</dependency>

Pokud projekt spustíte nyní, vše by mělo proběhnout v pořádku.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.6.RELEASE)

2017-09-05 13:53:11.461  INFO 12504 --- [           main] c.v.s.SpringBootBatchApplication         : Starting SpringBootBatchApplication on W2AB00HL with PID 12504 (C:\Users\jd99517\Documents\STS\WorkspaceSpringBatch\spring_boot_batch\spring_boot_batch\target\classes started by JD99517 in C:\Users\jd99517\Documents\STS\WorkspaceSpringBatch\spring_boot_batch\spring_boot_batch)
2017-09-05 13:53:11.464  INFO 12504 --- [           main] c.v.s.SpringBootBatchApplication         : No active profile set, falling back to default profiles: default
2017-09-05 13:53:11.510  INFO 12504 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3bbc39f8: startup date [Tue Sep 05 13:53:11 CEST 2017]; root of context hierarchy
2017-09-05 13:53:12.240  INFO 12504 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-09-05 13:53:12.250  INFO 12504 --- [           main] c.v.s.SpringBootBatchApplication         : Started SpringBootBatchApplication in 1.049 seconds (JVM running for 1.64)
2017-09-05 13:53:12.250  INFO 12504 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3bbc39f8: startup date [Tue Sep 05 13:53:11 CEST 2017]; root of context hierarchy
2017-09-05 13:53:12.251  INFO 12504 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

Spring Boot JDBC projekt

Nový projekt si necháme vygenerovat na adrese start.spring.io. Budeme chtít závislosti JDBC a PostgreSQL. Více k vytváření projektů pomocí spring initializeru naleznete v tomto příspěvku.

spring_boot_jdbc_generate_project

Stažený projekt (.zip soubor) rozbalíme a naimportujeme do STS (Eclipse): File -> Import -> Maven -> Existing Maven Projects -> Next -> Root Directory (vybrat rozbalený projekt) -> Finish.
Pokud se nyní pokusíte projekt spustit (pravým na projekt -> Run As -> Spring Boot App) dostanete následující chybu:

***************************
APPLICATION FAILED TO START
***************************

Description:

Cannot determine embedded database driver class for database type NONE

Action:

If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).

Je třeba do souboru application.properties přidat data pro připojení k databázi. Více k tomuto tématu si můžete přečíst v tomto příspěvku.

Číst dálSpring Boot JDBC projekt

Spring Initializr

Spring Initializr je generátor Spring projektů. Jedná se o webové rozhraní kde je možné zadat parametry projektu a po kliknutí na „Generate Project“ se stáhne .zip soubor s vygenerovaným projektem. Jelikož se jedná o Maven projekt (nebo Gradle project, záleží na tom, co si vyberete), je pak velmi jednoduché ho naimportovat do preferovaného IDE a začít vyvíjet. Spring Initializr vám vygeneruje adresářovou strukturu projektu, přidá všechny potřebné závislosti a provede základní nastavení tak, že projekt lze sbuildovat a spustit.

Pokud použijete integrovanou databázi jako například H2, nemusíte pro spuštění vygenerovaného projektu nastavovat nic. Pokud chcete použít externí databázi jako například PostgreSQL, bude vám stačit dodat jen konfiguraci DataSource: řetězec pro připojení, uživatelské jméno, heslo.

spring_initializr

Na snímku je vidět, že budu generovat projekt s názvem „myproject“ a jako závislosti budou použity JPA a databáze H2.

Spring Boot a Cannot determine embedded database driver class for database type NONE

Spring Boot razantně zjednodušuje práci s frameworkem Spring, hlavně konfigurační část. Přidáním pár závislostí do Mavenu (popřípadě vygenerováním projektu v Spring Initializr) máte připravenou a funkční kostru projektu. I při tomto uživatelsky přívětivém postupu se může objevit zádrhel. Tím může být spuštění kostry vytvořeného projektu, kdy dostanete následující chybovou hlášku:

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-01-12 19:31:16.365 ERROR 43892 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Cannot determine embedded database driver class for database type NONE

Action:

If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).

Spring Boot vám rovnou nakonfiguruje databázi pro váš projekt (pokud databázi chcete používat). Konfiguraci ale může provést pouze pro integrované databáze typu H2, HSQL či Derby. Pokud chcete používat jinou databázi, je třeba uvést alespoň základní konfiguraci do application.properties souboru. Pokud dostanete výše uvedenou chybu, může to mít několik příčin:

Číst dálSpring Boot a Cannot determine embedded database driver class for database type NONE