BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Podobne dokumenty
Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

JAVA EE 8. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Java: interfejsy i klasy wewnętrzne

Programowanie obiektowe

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń, zastosowanie walidatorów, wykonanie listy typu Drop Down List.

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Dokumentacja do API Javy.

Podstawowe informacje o technologii Java Persistence API - przykład

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie obiektowe

JAVA PERSISTENCE API CZĘŚĆ 2 ASPEKTY ZAAWANSOWANE. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Klasy abstrakcyjne, interfejsy i polimorfizm

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Platformy Technologiczne

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Programowanie obiektowe

Modelowanie obiektowe

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Stanowe komponenty sesyjne

Aplikacje w środowisku Java

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

akademia androida Składowanie danych część VI

NHibernate Hibernate dla platformy.net. Hibernate posiada także dużą społeczność, zatem nietrudno uzyskać jakieś wsparcie w przypadku problemów.

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń

Zastosowanie słuchaczy zdarzeń wg

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Diagram stanów Laboratorium 9

Wykład 7: Pakiety i Interfejsy

Współbieżność w środowisku Java

Katalog książek cz. 2

Usługa TimerService

Wzorce logiki dziedziny

Laboratorium 8 Diagramy aktywności

UML a kod. C++, Java i C#

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Klasy i obiekty cz II

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Aplikacje RMI

Klasy abstrakcyjne i interfejsy

Programowanie komponentowe 5

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Programowanie obiektowe

Komponenty sterowane komunikatami

Aplikacje RMI Lab4

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Instrukcja 5 Laboratorium z Podstaw Inżynierii Oprogramowania. Warstwy integracji z bazą danych: Wzorzec DAO Technologia ORM

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Java. Michał Wójcik.

Programowanie obiektowe

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Systemy Rozproszone. Spis treści. Temat projektu: Regułowy system analizujacy logi. autorzy: Rafał Sadłowski, Sebastian Falkus, Michał Różycki

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski

5 AS SP.NET MVC. Walidacja danych. Zaawansowane programowanie internetowe Instrukcja nr 5

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Zaawansowane Aplikacje Internetowe

Polimorfizm. dr Jarosław Skaruz

Platformy Programistyczne Podstawy języka Java

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Projekt INP Instrukcja 1. Autor Dr inż. Zofia Kruczkiewicz

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Enkapsulacja, dziedziczenie, polimorfizm

1 Atrybuty i metody klasowe

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Specyfikacje formalne

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Język JAVA podstawy. Wykład 4, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Aplikacje w środowisku Java

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Bezpieczeństwo frameworków WEBowych Java na przykładzie ataku CSRF

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Języki i metody programowania Java INF302W Wykład 2 (część 1)

JAVA EE MODEL APLIKACJI. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Enterprise JavaBeans

Wykład 2: Podstawy Języka

Podstawowe informacje o technologii Java Persistence API - przykład

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

1. Podstawowe usługi bezpieczeństwa. 2. Użytkownicy i role. przydzielanie uprawnie ń metodom, role komponentów, korzystanie i konfiguracja

Kurs programowania. Wykład 9. Wojciech Macyna

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Złożone komponenty JSF wg

Java Platform Micro Edition

Kurs rozszerzony języka Python

1. Co można powiedzieć o poniższym kodzie (zakładając, że znajduje się on w jednym pliku A.java)?

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Transkrypt:

BEAN VALIDATION Waldemar Korłub Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Bean Validation Uniwersalny mechanizm walidacji danych we wszystkich warstwach aplikacji Warstwa interfejsu, np. JSF Warstwa biznesowa, np. EJB, CDI Warstwa dostępu do danych, np. JPA Jednorazowo definiowane walidatory i reguły walidacji do wykorzystania we wszystkich warstwach Nie ma potrzeby duplikowania logiki walidującej

Standardowe walidatory Adnotacja Typ pola Opis @NotNull Dowolny Wartość inna niż null @Null Dowolny Wartość równa null @Size( Ciągi znaków, Rozmiar w przedziale [X, Y] min=x, max=y) kolekcje @Pattern(regex=X) Ciągi znaków Ciąg znaków pasuje do wyrażenia regularnego @Min(value=X) Liczby Wartość liczbowa minimum X @Max(value=X) Liczby Wartość liczbowa maksimum X @Future Daty Data w przyszłości @Past Daty Data w przeszłości @AssertTrue Boolean Flaga ma wartość true @AssertFalse Boolean Flaga ma wartość false

Dodatkowe walidatory: Biblioteka Hibernate Validator Adnotacja Typ pola Opis @NotEmpty Ciągi znaków, kolekcje Element nie zawiera wartości null i nie jest pusty @NotBlank Ciągi znaków Element nie zawiera wartości null i nie jest pusty, ignoruje białe znaki na końcu wartości @Range(min=X, max=y) @Length(min=X, max=y) Liczby Ciągi znaków Liczba leży w podanym zakresie (łączy @Min i @Max w jednej adnotacji) Długość ciągu znaków mieści się w przedziale [X, Y]

Dodatkowe walidatory: Biblioteka Hibernate Validator Adnotacja Typ pola Opis @Email Ciągi znaków Ciąg znaków zawiera poprawny adres e-mail @URL Ciągi znaków Ciąg znaków zawiera poprawny adres URL @CreditCardNumber Ciągi znaków Ciąg znaków zawiera poprawny numer karty kredytowej @SafeHtml Ciągi znaków Ciąg znaków zawiera bezpieczny z punktu widzenia ataków XSS kod HTML

Przykłady użycia @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @NotBlank private String title; @Past @Temporal(TemporalType.TIMESTAMP) private Date publishdate; @Size(min = 1) @ManyToMany private List<Author> authors = new ArrayList<>();

Własny walidator Definicja własnego walidatora obejmuje dwa elementy: Klasę z interfejsem ConstraintValidator n Zawiera logikę weryfikującą poprawność przekazywanej wartości Adnotację znakującą n Pozwala wskazać pola mające podlegać walidacji n Opatrzona adnotacją @Constraint n Może posiadać dodatkowe parametry do sprecyzowania reguł walidacji

Adnotacja znakująca @Target({ElementType.FIELD, ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = InPastValidator.class) @Documented public @interface InPast { String message() default "{pl.gda.pg.eti.kask.inpast.in_past"; Class<?>[] groups() default {; Class<? extends Payload>[] payload() default {; String date() default "";

Meta-adnotacje Semantykę adnotacji definiuje się za pomocą jakże by inaczej innych adnotacji @Target określa jakie elementy mogą być oznaczane adnotacją @Retention określa jak długo będzie dostępna informacja o obecności adnotacji: RUNTIME w czasie działania aplikacji CLASS w skompilowanych klasach SOURCE tylko w kodzie źródłowym @Documented wystąpienia adnotacji zostaną udokumentowane w klasach, które ich używają

Meta-adnotacja @Constraint Adnotacje opatrzone meta-adnotacją @Constraint są rozpoznawane jako adnotacje znakujące walidatorów Atrybut validatedby określa klasę z logiką walidatora Adnotacja znakująca musi zawierać pola: message komunikat informujący o błędzie walidacji n Może odnosić się do klucza wielojęzycznego zasobu (ValidationMessages.properties w domyślnym pakiecie) groups lista grup, w których reguła walidacji jest aktywna payload dodatkowa informacja do wykorzystania przez dewelopera (nie jest używana przez Bean Validation API)

Klasa walidująca public class InPastValidator implements ConstraintValidator<InPast, Date> { public static final String DATE_PATTERN = "yyyy-mm-dd"; private Date date = new Date(); @Override public void initialize(inpast constraintannotation) { if (!constraintannotation.date().equals("")) { try { date = new SimpleDateFormat(DATE_PATTERN).parse(constraintAnnotation.date()); catch (ParseException ex) { @Override public boolean isvalid(date value, ConstraintValidatorContext context) { return date.after(value);

Przykłady użycia @Entity public class Book { //... @InPast(date = "2013-10-19") @Temporal(TemporalType.TIMESTAMP) private Date publishdate;

Walidacja powiązanych pól W wielu sytuacjach obiekty posiadają pola o powiązanych ze sobą wartościach, np.: Nowe hasło oraz powtórz nowe hasło (w formularzu rejestracji/zmiany hasła) Miasto oraz kod pocztowy (w formularzu zamówienia) Walidacja wymaga dostępu do wartości wszystkich powiązanych pól Bean Validation umożliwia zadeklarowanie walidatora na poziomie klasy Z dostępem do wszystkich składowych obiektów tej klasy

Przykład: formularz rejestracji public class RegistrationForm { @NotBlank String login; @NotBlank String password; @NotBlank String passwordrepeat;

Adnotacja znakująca @Target({TYPE) @Retention(RUNTIME) @Constraint(validatedBy = RepeatPasswordValidator.class) @Documented public @interface RepeatPassword { String message() default "Hasła muszą być takie same"; Class<?>[] groups() default {; Class<? extends Payload>[] payload() default {;

Klasa walidująca public class RepeatPasswordValidator implements ConstraintValidator<RepeatPassword, RegistrationForm> { @Override public void initialize(repeatpassword constraintannotation) { @Override public boolean isvalid(registrationform value, ConstraintValidatorContext context) { return value.getpassword().equals(value.getpasswordrepeat());

Wykorzystanie walidatora @RepeatPassword public class RegistrationForm { @NotBlank String login; @NotBlank String password; @NotBlank String passwordrepeat;

Grupowanie reguł walidacji Ten sam obiekt może wymagać innych reguł walidacji na różnych etapach przetwarzania Dane wpisywane w formularzu przez użytkownika Pola o wartościach wyliczanych w warstwie logiki biznesowej Weryfikacja wszystkich pól przed zapisem do bazy danych Bean Validation pozwala na przypisywanie reguł walidacji do grup W czasie walidacji należy wskazać, która grupa ma zostać zweryfikowana

Grupowanie reguł walidacji Grupy deklarowane są jako interfejsy znakujące (interfejsy bez metod) z braku bardziej adekwatnego mechanizmu w języku Przykładowo: Grupa dla informacji wprowadzanych przez użytkownika w formularzu na stronie: public interface UserInput { Grupa dla informacji dodawanych przez wydawcę: public interface PublisherAddons {

Przypisywanie grup @Entity public class Book { @Id private Integer id; @NotBlank private String title; Grupa domyślna (Default.class) @Past(groups = PublisherAddons.class) @Temporal(TemporalType.TIMESTAMP) private Date publishdate; @Pattern(regexp = "...", groups = PublisherAddons.class) private String isbn; @Size(min = 1, groups = UserInput.class) @ManyToMany private List<Author> authors = new ArrayList<>();

Walidacja wybranych grup Obiekt klasy Validator sterowanie procesem walidacji: Validator validator = /*...*/; Tylko grupa domyślna: Set<ConstraintViolation<Book>> errors = validator.validate(book); Grupa domyślna oraz UserInput validator.validate(book, Default.class, UserInput.class); Tylko grupa PublisherAddons validator.validate(book, PublisherAddons.class); W widoku JSF: <f:validatebean validationgroups="pl.edu.pg.eti.userinput"/>

Pytania?