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é

Ignorování JUnit testů

V případě, že potřebujete, aby se některé JUnit testy nespouštěly, nabízí JUnit anotaci @Ignore (javadoc).

import org.junit.Ignore;
import org.junit.Test;

public class JUnitIgnoreTest {

	@Ignore
	@Test
	public void test1() {
		assertEquals(11, 22);
	}

	@Test
	public void test2() {
		assertEquals(2, 2);
	}
}

junit-ignore-annotace

Je vidět, test byl ignorován. Pokud bychom anotaci @Ignore v tomto případě zakomentovali, test by spadl. Anotaci je možné použít na celou třídu. V tom případě se neprovede žádný test z této třídy.

Rozhraní a defaultní metody v Javě

Defaultní metody v rozhraní nám umožňují přidávat do rozhraní nové metody bez toho, abychom rozbili původní kód. Zde je jednoduchý příklad.

rozhraní MyIntf.java

public interface MyIntf {
	void print(String text);
}

implementace MyIntfImpl.java

public class MyIntfImpl implements MyIntf {

	@Override
	public void print(String text) {
		System.out.println("Printing: " + text);
	}
}

Číst dálRozhraní a defaultní metody v Javě

Nepoužívání hvězdičkového importu v Idea IDE

V případě, že máte několik importů ze stejného balíčku, Idea IDE nahradí jednotlivé importy hvězdičkou (ve výchozím nastavení od pěti importů):

import java.util.*

Pokud vám toto chování nevyhovuje, nastavení lze změnit v Settings -> Editor -> Code Style -> Java -> záložka Imports. Zde nastavte nějaké vysoké číslo.

idea-zakazani-hvezdickovych-importu

import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Map;

Java 8 – filter a map

Java 8 představila streamy a ty mají různé metody. V tomto příspěvku si ukážeme použití metod filter a map. Z původního seznamu se nejdříve vyfiltrují položky, které mají (present) status a vrátí se nový seznam, který obsahuje tyto statusy.

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class App2 {

	public static void main(String[] args) {
		List<MO> list = Arrays.asList(
				new MO(Optional.of(Status.CLOSED.getId()), "AAA"),
				new MO(Optional.of(Status.OPEN.getId()), "BBB"),
				new MO(Optional.empty(), "CCC"),
				new MO(Optional.empty(), "DDD"),
				new MO(Optional.of(Status.OPEN.getId()), "EEE")
		);

		List<Long> open = list.stream()
			.filter(myObject -> myObject.getStatus().isPresent())
			.map(myObject -> myObject.getStatus().get())
			.collect(Collectors.toList());

		open.forEach(System.out::println);
	}

	private enum Status {
		OPEN(1L), CLOSED(2L);

		private long id;

		private Status(long id) {
			this.id = id;
		}

		public long getId() {
			return id;
		}
	}
}
 class MO {

	private Optional<Long> status;
	private String name;

	public MO(Optional<Long> status, String name) {
		this.status = status;
		this.name = name;
	}

	public Optional<Long> getStatus() {
		return status;
	}

	public void setStatus(Optional<Long> status) {
		this.status = status;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

Výsledek:

2
1
1

Filtrování v Java 8

Java 8 představila streamy a ty mají metodu filter, která má jako parametr predikát (funkce vracejítí pravdu nebo nepravdu). V následujícím příkladu se z původního seznamu vytvoří nový seznam, který bude obsahovat pouze objekty se statusem OPEN.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class App {

	public static void main(String[] args) {
		List<MyObject> list = Arrays.asList(
				new MyObject(Status.CLOSED.getId(), "AAA"),
				new MyObject(Status.OPEN.getId(), "BBB"),
				new MyObject(Status.OPEN.getId(), "CCC"),
				new MyObject(Status.CLOSED.getId(), "DDD"),
				new MyObject(Status.OPEN.getId(), "EEE")
		);

		List<MyObject> open = list.stream()
			.filter(myObject -> myObject.getStatus() == Status.OPEN.id)
			.collect(Collectors.toList());

		open.forEach(openObject -> System.out.println(openObject.getName()));
	}

	private enum Status {
		OPEN(1L), CLOSED(2L);

		private long id;

		private Status(long id) {
			this.id = id;
		}

		public long getId() {
			return id;
		}
	}
}
 class MyObject {

	private long status;
	private String name;

	public MyObject(long status, String name) {
		this.status = status;
		this.name = name;
	}

	public long getStatus() {
		return status;
	}

	public void setStatus(long status) {
		this.status = status;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

Výsledek:

BBB
CCC
EEE