Spring OAuth2

Pro vytvoření oauth autorizace nabízí spring knihovnu

org.springframework.security.oauth:spring-security-oauth

Zde najdete celkem 8 endpointů označených anotací @FrameworkEndpoint:

  • /oauth/authorize (class AuthorizationEndpoint)
  • /oauth/authorize, method = RequestMethod.POST, params = OAuth2Utils.USER_OAUTH_APPROVAL (class AuthorizationEndpoint)
  • /oauth/check_token (class CheckTokenEndpoint)
  • /oauth/token, method=RequestMethod.GET (class TokenEndpoint)
  • /oauth/token, method=RequestMethod.POST (class TokenEndpoint)
  • /oauth/token_key, method = RequestMethod.GET (class TokenKeyEndpoint)
  • /oauth/confirm_access (class WhitelabelApprovalEndpoint)
  • /oauth/error (class WhitelabelErrorEndpoint)

Anotace @FrameworkEndpoint znamená, že tyto endpointy jsou vytvořeny frameworkem. Nemusíte je tedy vytvářet sami.

Spring, Kotlin a JSON decoding errors

Nedávno jsem narazil na zajímavý problém. Měl jsem dvě služby, kdy se přes REST rozhraní zavolá jedna, ta provolá druhou a vrátí výsledek. Původní odpověď vypadala takto:

data class GetAchievementsResponse(
        achievements: List<AchievementInfo>
)

Jakmile jsem ale objekt změnil takto:

data class GetAchievementsResponse(
        val aAchievements: List<AchievementInfo>,
        val rAchievements: List<AchievementInfo>
)

Začal jsem dostávat tyto chyby:

JSON decoding error: Instantiation of [simple type, class cz.vitfo.client.GetAchievementsResponse] value failed for JSON property aAchievements due to missing (therefore NULL) value for creator parameter aAchievements which is a non-nullable type
JSON decoding error: Cannot deserialize instance of `java.util.ArrayList` out of FIELD_NAME token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of FIELD_NAME token

Nakonec jsem přišel na to, že z nějakého důvodu com.fasterxml.jackson v tomto případě nezvládá camel case názvy proměnných. Řešením bylo toto pojmenování:

data class GetAchievementsResponse(
        val a_achievements: List<AchievementInfo>,
        val r_achievements: List<AchievementInfo>
)

Spuštění kódu při startu Springu

Pokud potřebujete spusti určitý kód po naběhnutí Springu, můžete použít CommandLineRunner. Je to rozhraní, které indikuje beanu, která má být spuštěna jakmile je ve Spring aplikaci.

Interface used to indicate that a bean should run when it is contained within a SpringApplication. Multiple CommandLineRunner beans can be defined within the same application context and can be ordered using the Ordered interface or Order @Order annotation.

Zde je jednoduchý příklad, kdy si vytvoříme konfigurační třídu s názvem SpringDataConfig.

Číst dálSpuštění kódu při startu Springu

Změna verze Javy z 8 na 11

Nedávno jsem prováděl změny verze Javy na projektu, který používá Spring Boot. Měnil jsem verzi Javy z verze 8 na verzi 11. Nebylo to až tak strašné, jak jsem čekal (spíše naopak), přesto se ale některé komplikace objevily. V tomto příspěvku budu postupovat od chyby k chybě, tak jak se u mě objevovaly.

Číst dálZměna verze Javy z 8 na 11

Spring – Java konfigurační soubor a konfigurace anotacemi

Spring má dva hlavní způsoby konfigurace (XML a Javu), ale tři hlavní přístupy ke konfiguraci a každý z těchto přístupů má několik názvů.

  • Konfigurace využívající XML (XML based configuration)
    • XML konfigurační soubor a XML konfigurace (XML config and XML-driven/based configuration)
    • XML konfigurační soubor a konfigurace anotacemi (XML config and annotation-driven/based configuration)
  • Konfigurace využívající Javu
    • Java konfigurační soubor a konfigurace anotacemi (Java config and annotation-driven/based configuration | Java based configuration | JavaConfig)

Java konfigurační soubor a konfigurace anotacemi
V tomto příspěvku se podíváme na Java konfigurační soubor a konfigurace anotacemi. V tomto případě se používá pro konfiguraci Java třída a anotace (@Autowired, @Service, …).

Naše jednoduchá aplikace bude mít dvě rozhraní MessageService a SecurityService. Rozhraní MessageService bude mít metodu String getMessage() a SecurityService String encode(String text). Funkčnost aplikace je tato: nejdříve získá řetězec (metoda getMessage()) a ten potom zašifruje (metoda encode()). Vlastní způsob šifrování, implementovaný v SecurityServiceImpl, bude triviální. Všechny písmena e v textu změníme za € a všechna písmena s za §.

Číst dálSpring – Java konfigurační soubor a konfigurace anotacemi

Spring – XML konfigurační soubor a konfigurace anotacemi

Spring má dva hlavní způsoby konfigurace (XML a Javu), ale tři hlavní přístupy ke konfiguraci a každý z těchto přístupů má několik názvů.

  • Konfigurace využívající XML (XML based configuration)
    • XML konfigurační soubor a XML konfigurace (XML config and XML-driven/based configuration)
    • XML konfigurační soubor a konfigurace anotacemi (XML config and annotation-driven/based configuration)
  • Konfigurace využívající Javu
    • Java konfigurační soubor a konfigurace anotacemi (Java config and annotation-driven/based configuration | Java based configuration | JavaConfig)

XML konfigurační soubor a konfigurace anotacemi
V tomto příspěvku se podíváme na XML konfigurační soubor a konfigurace anotacemi. V tomto případě se používá pro konfiguraci XML soubor, ale pro injektování (vytvoření instance a dosazení do požadované proměnné) se používají anotace (@Autowired, @Service, …).

Naše jednoduchá aplikace bude mít dvě rozhraní MessageService a SecurityService. Rozhraní MessageService bude mít metodu String getMessage() a SecurityService String encode(String text). Funkčnost aplikace je tato: nejdříve získá řetězec (metoda getMessage()) a ten potom zašifruje (metoda encode()). Vlastní způsob šifrování, implementovaný v SecurityServiceImpl, bude triviální. Všechny písmena e v textu změníme za € a všechna písmena s za §.

Číst dálSpring – XML konfigurační soubor a konfigurace anotacemi

Nefunkční debugování v STS

Pokud jste si nainstalovali STS (Spring Tool Suite) a zkoušíte marně debugovat, tak na vině bude pravděpodobně výchozí zapnutí „Skip All Breakpoints“, které ignoruje všechny breakpointy. Pokud je ikona breakpointu na řádku přeškrtnuta, máte právě toto nastavení aktivní. Vypnout se dá v perspektivě Debug, když v horním řádku záložky Breakpoints odznačíte ikonu Skip All Breakpoints.

sts-skip-all-breakpoints

Spring – XML konfigurační soubor a XML konfigurace

Spring má dva hlavní způsoby konfigurace (XML a Javu), ale tři hlavní přístupy ke konfiguraci a každý z těchto přístupů má několik názvů.

  • Konfigurace využívající XML (XML based configuration)
    • XML konfigurační soubor a XML konfigurace (XML config and XML-driven/based configuration)
    • XML konfigurační soubor a konfigurace anotacemi (XML config and annotation-driven/based configuration)
  • Konfigurace využívající Javu
    • Java konfigurační soubor a konfigurace anotacemi (Java config and annotation-driven/based configuration | Java based configuration | JavaConfig)

XML konfigurační soubor a XML konfigurace
V tomto příspěvku se podíváme na XML konfigurační soubor a XML konfigurace. V tomto případě se používá pro konfiguraci XML soubor (beans.xml), ve kterém jsou definovány beany.

Naše jednoduchá aplikace bude mít dvě rozhraní MessageService a SecurityService. Rozhraní MessageService bude mít metodu String getMessage() a SecurityService String encode(String text). Funkčnost aplikace je tato: nejdříve získá řetězec (metoda getMessage()) a ten potom zašifruje (metoda encode()). Vlastní způsob šifrování, implementovaný v SecurityServiceImpl, bude triviální. Všechny písmena e v textu změníme za € a všechna písmena s za §.

Číst dálSpring – XML konfigurační soubor a XML konfigurace

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, properties a @Value anotace

Spring framework umožňuje jednoduše načítat hodnoty z properties souboru a to pomocí anotace @Value. Nejjednodušší je vše ukázat na příkladu.

Struktura projektu

│   pom.xml
│
├───src
│   ├───main
│   │   └───java
│   │       └───cz
│   │           └───vitfo
│   │               └───spring
│   │                       App.java
│   │                       MyClass.java
│   │
│   ├───resource
│   │       app.properties
│   │       beans.xml

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>cz.vitfo</groupId>
	<artifactId>spring01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>spring01</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring-version>4.3.5.RELEASE</spring-version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring-version}</version>
		</dependency>
	</dependencies>
</project>

Číst dálSpring, properties a @Value anotace