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

Editor nano

Nano je jednoduchý textový editor, který je v mnoha linuxových distribucích už nainstalován. I pres svoji jednoduchost nabízí řadu funkcí.

nano spustí editor
nano nazev_souboru spustí editor a otevře v něm daný soubor
nano /cesta_k_souboru/nazev_souboru spustí editor a otevře v něm daný soubor

Po otevření editoru jsou ve spodní části vypsány klávesové zkratky s popisem činnosti. Stříška znamená klávesu Ctrl.

Číst dálEditor nano

Responsivní tlačítka v Vaadinu

V tomto příspěvku ukážu, jak vytvořit ve Vaadin 8 tlačítka, která se přizpůsobí velikosti prohlížeče. Pokud bude mít prohlížeč šířku větší než 500px, rozbrazí se tlačítko včetně popisku. Pokud bude šířka menší než 500px, zobrazí se pouze ikona.

VerticalLayout layout = new VerticalLayout();
layout.addStyleName("flexible-layout");
Responsive.makeResponsive(layout);

Button btnAir = new Button("Airplane", VaadinIcons.AIRPLANE);
btnAir.addStyleName("flexible-button");
Button btnBoat = new Button("Boat", VaadinIcons.BOAT);
btnBoat.addStyleName("flexible-button");
Button btnEye = new Button("Eye", VaadinIcons.EYE);
btnEye.addStyleName("flexible-button");
Button btnUser = new Button("User", VaadinIcons.USER);
btnUser.addStyleName("flexible-button");
layout.addComponents(btnAir, btnBoat, btnEye, btnUser);

Tlačítku přidávám styl flexible-button a layoutu flexible-layout. Aby to fungovalo, je ještě potřeba udělat layout responsivní pomocí statické metody Responsive.makeResponsive().

Ostylování pomocí css. Zde třídě flexible-layout přidávám range a určuji, jak má v daném rozsahu vypadat styl třídy flexible-button.

@import "../valo/valo.scss";

@mixin mytheme {
    @include valo;

    // Insert your own theme rules here
  
	.flexible-layout {
	    background: black;
	    color: white;
	
	.flexible-layout[width-range~="0-499px"] {
	    .flexible-button .v-button-caption {
	    	display: none;
	    }
	}
	
	.flexible-layout[width-range~="500px-"] {
	    .flexible-button .v-button-caption {}
	    
	}
}

A takto to vypadá

Zobrazení effective pom v Idea IDE

V Idea IDE lze efektivní pom zobrazit následovně: Kliknout pravým tlačítkem na pom.xml v projektu -> Maven -> Show Effective POM.

Vysvětlení pojmů

Super pom
Všechny maven projekty dědí z super pomu, který obsahuje defaultní hodnoty. Super pom je rodič všech pom souborů.

Simple pom
Pom, který je ve vašem projektu. V případě jednoduchého projektu není třeba definovat téměr vůbec nic, vše potřebné se vezme ze super pomu.

Effective pom
Spojení super a simple (projektového) pomu.


Zdroje:

Problémy při vytváření webového projektu v Javě

Pokud si necháme vygenerovat projekt pomocí mavenu: File -> New -> Maven project -> maven-archetype-webapp (verze 1.0) -> … a pokud tento projekt nasadíme na Tomcat, zobrazí se očekávaný výstup – jednoduchá stránka s textem „Hello World!“. Problém nastane v okamžiku, kdy začneme používat jsp.
Když původní jednoduchou stránku

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

nahradíme například tímto:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ prefix="c" taglib uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
	<c:set var="message" value="Hello World"/>
	<c:set var="otherMessage" value="This is other message."/>
	<c:set var="display" value="${true}"/>
	<c:if test="${display}">
		<c:out value="${message}"></c:out>
	</c:if>
	<c:out value="${otherMessage}"></c:out>
</body>
</html>

dostaneme tuto chybu:

Číst dálProblémy při vytváření webového projektu v Javě

Proudy v Java 8

Proudové (stream) zpracovávání je novinka Javy 8. Cílem je zjednodušit operace nad posloupnostmi prvků. Umožňují zřetězení operací. Operace se dělí do dvou hlavních skupin:

  • terminální (terminal) – touto operací je proud uzavřen
  • neterminální (intermediate) – vytváří nový proud

Jak je vidět z popisu, neterminální operace lze za sebou řetězit, dokud se nezavolá operace terminální.

Nejpoužívanější operace jsou

forEach terminální všechny prvky proudu postupně odešle konzumentovi
findFirst terminální vrátí první prvek pokud existuje
collect terminální sesbírá elementy a vytvoří z nich návratovou strukturu
map neterminální převede prvky na jiné
filter neterminální filtruje podle zadaného predikátu (podmínky)
sorted neterminální seřadí prvky

Příklady použití.

Číst dálProudy v Java 8

Testování private static final proměnné

Při testování se můžeme setkat s tím, že potřebujeme otestovat funkcionalitu, která není přes vystavené API přístupná. Jako příklad zde uvedu třídu Extractor. Jedná se o třídu, která čte soubor z přesně zadaného umístění. Z toho důvodu je soubor zadán jako private static final. Jak otestovat metodu getContent(), když nemáme přístup k souboru C:\input.txt (nemůžeme tento soubor modifikovat a dokonce tento soubor ani nemusí v době testů existovat)? Řešením je použít reflexi.

Extractor.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Extractor {
	private static final File INPUT = new File("C:\\input.txt");
	
	public Extractor() {}
	
	public String getContent() {
		String result = "";
		try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(INPUT), "UTF-8"))) {
			String line;
			while ((line = br.readLine()) != null) {
				result = result + line;
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
		return result;
	}
}

Testovací soubor testinput.txt umístěný v src/test/resources.

Číst dálTestování private static final proměnné