Archiwa tagów: Java

Criteria API multiselect i różnice w implementacjach JPA

Tworzenie zapytań w JPA to rzecz zarazem łatwa jak i trudna. Łatwa, bo bardzo prosto jest stworzyć zapytanie oparte o zwykłego SQL’a lub JPQL’a, a nawet zapytania tworzone za pomocą Criteria API nie są czymś nadzwyczajnym. Zarazem jest to jednak trudny temat, bo trzeba pamiętać o wielu kwestiach związanych z wydajnością lub bezpieczeństwem, których pominięcie może spowodować spore problemy w przyszłości. Nie chcę tu się rozpisywać po trochu o wszystkim, a poruszyć jeden temat, który zaciekawił mnie szczególnie.

Jedną z ważniejszych rzeczy związanych z projektowaniem zapytań do bazy danych jest zawężanie zapytań w taki sposób, aby zwracały tylko niezbędne do konkretnego widoku aplikacji dane. Gdy używamy technologii ajaxowych (np. GWT), ogranicza to nam ilość przesyłanych danych do przeglądarki, a nawet jeśli nie, to mniej cierpi na tym serwerowy cache (jeśli go włączyliśmy). JPA dostarcza kilka rozwiązań, które umożliwiają zawężenie wyników zapytań, a ciekawsze z nich to Constructor Expression wykorzystane wraz z Named Queries, oraz multiselect w Criteria API. Ciekawsze, bo oba pozwalają zmapować zapytanie bezpośrednio na konstruktor klasy DTO. Dziś będzie o tylko o tym drugim, czyli o metodzie multiselect.

Czytaj więcej »

O Warsjawie 2012 słów kilka

wjug-logo

Dnia dzisiejszego odbyła się konferencja warsztatowa Warsjawa 2012. Obecnie jest to chyba największa tego typu konferencja w Polsce, która z roku na rok przyciąga coraz większą ilość uczestników i prelegentów. W tym roku można było zapisać się na jedną z 10 ścieżek warsztatowych, z których większość dotyczyła tematów około-javowych, ale znalazło się też kilka traktujących o zupełnie innej tematyce. Zapisywać na warsztaty trzeba było się dość szybko, bo miejsca zostały obsadzone zaledwie w przeciągu kilku dni. Mi dane było udać się na ścieżkę: Injektowanie zależności w GUICE + zdalne injektowanie, więc to z jej punktu widzenia zdam relację z konferencji :)

Na początek duża pochwała dla organizatorów, bo organizując takie konferencje robią coś naprawdę wspaniałego. Miło jest patrzeć, jak społeczność javowa w Polsce stale się rozwija i skupia wokół siebie coraz większe zainteresowanie. Nie byłem na poprzednich edycjach Warsjawy, więc ciężko mi jest porównać do nich dzisiejsze wydarzenie, jednak dziś odbyło się wszystko bez wpadek, większych problemów i obsunięć czasowych, za co należy się duży plus. Spory minus za to dla samej społeczności, bo odniosłem wrażenie, że sporo osób dziś nie dotarło (zima ich zaskoczyła?), nie informując organizatorów o tym wcześniej, przez co przyblokowali miejsca dla innych potencjalnych chętnych uczestnictwa.

Czytaj więcej »

Co nowego w GWT 2.5?

Logo GWT

Ostatnimi czasy wydawać by się mogło, że ekipa Googla nieco spowolniła i dość długo kazała nam czekać na kolejne wydania GWT. Rzeczywiście dawniej nowe wersje pojawiały się zdecydowanie częściej i częściej też wprowadzały nowe, ciekawe rozwiązania. W sieci pojawiły się też głosy, że GWT staje się martwe, między innymi za sprawą języka Dart. Ludzie pracujący nad GWT dość szybko rozwiali jednak te wątpliwości i zapowiedzieli wersję 2.5, która przynosi nową, ciekawą funkcjonalność i ponownie wprowadza nieco świeżości w tą znakomitą bibliotekę. Od tamtej pory pojawiły się już dwa wydania kandydujące oznaczone odpowiednio RC1 i RC2, a na finalną wersję przyszło nam jeszcze trochę poczekać.

Od jakiegoś czasu systematycznie przyglądałem się zmianom wprowadzanym na repozytorium GWT, które zwiastowały coraz szybsze nadejście nowej wersji. Tak też się stało, bo zaledwie kilkanaście godzin temu wersja oznaczona numerkiem 2.5 stała się dostępna do pobrania! Czego więc nowego można się spodziewać? Czy warto jak najszybciej przenosić się ze sprawdzonej wersji 2.4?

Czytaj więcej »

Atmosphere Framework 1.0.0 już jest!

Po prawie 4 latach intensywnej pracy Jeanfrancois Arcand w końcu wydaje bibliotekę Atmosphere Framework w wersji 1.0.0! Ciężko tu przytoczyć listę zmian, jakie weszły w skład nowego wydania, bo autor Atmosphere’a nie prowadzi jakiegoś konkretnego changelog’a (mam nadzieję, że takowy pojawi się wraz z kolejnymi wydaniami), a jego rolę pełni obecnie spis zamkniętych zgłoszeń na github’ie. Najważniejsze jest jednak to, że osiągnięto pewny kamień milowy, który pozwala spokojnie stwierdzić, że Atmosphere jest na tyle dojrzały aby używać go produkcyjnie. W ostatnich wydaniach skupiono się przede wszystkim na poprawkach błędów i wzroście wydajności.

Dla niewtajemniczonych, Atmosphere jest biblioteką umożliwiającą wdrożenie architektury Comet w naszym projekcie. Dlaczego warto go stosować? Bo jest chyba jedyną biblioteką wspierającą tak wiele serwerów aplikacji oraz przeglądarek. Warto tu wymienić chociażby wsparcie dla serwerów Jetty, Tomcat, GlassFish, WebLogic, WepSphere czy JBoss oraz wszystkich najpopularniejszych przeglądarek (tabela kompatybilności znajduje się tutaj). Atmosphere działa tak, że sam wykrywa, w jakim środowisku został uruchomiony i jakie technologie przesyłania danych możliwe są do użycia (zarówno po stronie serwera jak i klienta). Nawet jeśli nie będą dostępne WebSockety, HTTP Streaming, czy inne natywne rozwiązania danego serwera, Atmosphere i tak będzie działać (korzystając z własnej implementacji)! Kod wystarczy napisać więc raz, a resztę możemy spokojnie zrzucić na barki tej biblioteki.

Atmosphere wspiera też dużo popularnych rozwiązań takich jak GWT, PrimeFaces, Apache Wicket, Vaadin, Grails, RichFaces, Scalatra, Apache Tuscany, JQuery-Socket oraz bardzo dobrze współpracuje ze Spring’iem i Guice’m. Jeśli używasz więc którejś z tych technologii i chcesz wdrożyć Comet’a, nie wahaj się, użyj Atmosphere’a!

Jak działa RequestFactory w GWT?

Jakiś czas temu pisałem na temat alternatywnego mechanizmu komunikacji klient-serwer w GWT, jakim jest RequestFactory. Omówiliśmy wtedy podstawy – zaimplementowaliśmy generyczną klasę DAO i wykonywaliśmy proste operacje CRUD. Przy okazji artykułu na temat JPA i walidacji encji pokazałem, jak w prosty sposób przeprowadzić walidację encji i zintegrować to z RequestFactory. Podczas omawiania relacji wiele-do-wielu i zapytań poprzez Criteria API w JPA 2.0 rozbudowaliśmy projekt wykorzystujący RequestFactory, jednak wtedy nie skupialiśmy się na części klienckiej, gdzie wykorzystywany jest tytułowy mechanizm. W żadnym z tych artykułów nie pisałem jednak na temat zasad działania RequestFactory, a domyślam się, że jesteś ciekaw jak to wszystko chodzi. W niniejszym wpisie chciałbym się skupić właśnie na stronie technicznej.

RequestFactory jest mechanizmem wprowadzonym w GWT 2.1 w celu dostarczenia alternatywy dla GWT-RPC. Alternatywy, dlatego że GWT-RPC dalej pozostaje podstawowym i najprostszym sposobem komunikacji klient-serwer, które nie jest jednak pozbawione kilku wad. RequestFactory jest przede wszystkim zorientowane na pobieranie danych (data-oriented) i doskonale integruje się z framework’ami bazodanowymi takimi jak np. Hibernate. Implementuje też walidację encji według normy JSR 303. Tak naprawdę mechanizm nadaje się do użytku od GWT 2.1.1, w której wprowadzono szereg udoskonaleń. W następnych wersjach pojawiały się mniejsze poprawki, zostały też zmienione pakiety wszystkich klas na mniej związane z samym GWT (z com.google.gwt na com.google.web.bindery), co sugeruje, że być może kiedyś zostanie wykorzystane poza GWT. W tym artykule opieram się na RequestFactory, jakie jest w GWT 2.4.

Czytaj więcej »

Przesyłanie daty w serwisach REST (Jersey)

Error 400 Bad Request… tak potraktował mnie dziś mój rest‚owy serwis, gdy próbowałem przekazać mu parametr z datą. Próby przekazywania daty w różnych formatach na nic się nie zdały, serwis dalej zbywał mnie brzydką odpowiedzią. A wyglądał on mniej więcej tak:

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_XML)
public Response action(@FormParam("date") Date date) {
  ...
}

W rzeczywistości ma jeszcze kilka innych parametrów, ale one przechodziły bez problemu. Co ciekawe, różne źródła w internecie mówią, że „u nich działa”. Szukamy zatem przyczyny problemu.

Czytaj więcej »

Integracja Shiro, Guice i GWT

shiro-logo.jpg

Jako że w związku z nadchodzącym dłuższym weekendem majowym (ręce do góry, kto nie bierze urlopu?), nastroje dziś są mocno weekendowe, będzie szybko i przyjemnie :) Poprzednio opisywałem w jaki sposób użyć Shiro w aplikacji GWT. Obecna wtedy wersja Shiro (1.1.0) nie wspierała natywnie Guice‚a, dlatego konfigurację oparliśmy na standardowych plikach shiro.ini oraz web.xml. Oczywiście wersję 1.1.0 da się zintegrować z Guice’m, co wymaga jednak użycia kilku tricków. Jeśli jesteś zainteresowany właśnie tą wersją Shiro, to w sieci można znaleźć kilka dobrych poradników.

Od jakiegoś czasu Shiro dostępne jest w wersji 1.2.0, w której to Guice jest już oficjalnie wspierany. Niestety na oficjalnej stronie Shiro nie wszystko zostało dokładnie wytłumaczone, dlatego chcę zaprezentować Ci najprostszy sposób połączenia tych dwóch framework’ów. Użyjemy do tego poprzednio stworzonej aplikacji, tak aby skupić się tylko na integracji z Guice’m. Czytaj więcej »

Jak pogodzić maven’a z maven’em? (m2e vs maven-eclipse-plugin)

maven-logo

W projektach opartych o Maven‚a często do integracji ze środowiskiem Eclipse używany jest plugin maven-eclipse-plugin. Za pomocą tego pluginu spod konsoli można wygenerować wszystkie niezbędne pliki projektu wymagane przez IDE. Z drugiej strony Eclipse musi zostać wyposażony w plugin do integracji z Maven’em, dzięki czemu będzie poprawnie rozpoznawał zależności, zapewni graficzne wsparcie edycji plików *.pom i dołoży klika innych przydatnych rzeczy. Wybór nie jest tu duży i zazwyczaj pada na wtyczkę m2eclipse (oprócz tego dostępny jest jeszcze Eclipse IAM).

Załóżmy więc, że wygenerowaliśmy pliki projektu za pomocą polecenia mvn eclipse:eclipse. Jeśli spróbujemy zaimportować taki projekt w IDE, z pewnością zauważymy, że m2eclipse nie jest w stanie poprawnie rozpoznawać zależności projektu. Gdy podejrzymy w edytorze tekstu plik .project, zobaczymy tam komentarz, który jednoznacznie wskazuje na problem:

NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.

Jak zatem przerobić taki projekt, aby był poprawnie rozpoznawany przez m2eclipse? Wystarczy kilka drobnych zmian w plikach .project i .classpath. Czytaj więcej »

Apache Shiro – uwierzytelnić lepiej?

shiro-logo.jpg

Jakiś czas temu opisywałem, jak szybko zaimplementować uwierzytelnianie w aplikacji GWT przy pomocy JAAS’a. Wtedy byłem trochę zafascynowany tym ostatnim i nie dostrzegałem wielu jego wad. Prosty moduł uwierzytelniania (mniej więcej taki, jaki wtedy stworzyliśmy) nie przysparza jeszcze większych trudności, jednak każde dodatkowe wymagania sprawiły, że JAAS coraz bardziej zaczął mnie zniechęcać. Nie twierdzę, że jest zły, tylko jego silna integracja z mechanizmami serwerów aplikacji sprawia, że aplikacja staje się mało przenaszalna i praktycznie przed każdym wdrożeniem na inny serwer moduł logowania trzeba implementować od nowa. Najgorsze w tym wszystkim jest to, że niektóre serwery udostępniają łatwe i przyjazne API do rozszerzania funkcjonalności uwierzytelniania, a inne z kolei utrudniają bądź wręcz to uniemożliwiają. Jeśli wiemy, że nasza aplikacja od początku do końca będzie współpracować z jednym tylko serwerem – problem znika, nie mniej i tak się namęczymy z implementacją kilku rzeczy.

Użerając się wciąż z JAAS’em w końcu postanowiłem spróbować czegoś innego. Padło na Apache Shiro – framework ułatwiający implementację uwierzytelniania, autoryzacji, szyfrowania i zarządzania sesjami w aplikacjach Java. Shiro wywodzi się ze starej biblioteki JSecurity i obecnie jest aktywnie rozwijane przez wielu deweloperów. Może być użyte w zwykłych aplikacjach Java oraz aplikacjach webowych, a mocna modularyzacja kodu pozwala na łatwe podstawianie swoich implementacji do tego co potrzebujemy. Przy okazji zawiera też wiele podstawowych metod uwierzytelniania, z których można skorzystać praktycznie od razu. Dodatkowo jeśli nasza aplikacja musi obsługiwać mechanizmy serwerowe, w Shiro można napisać własną implementację modułu logowania JAAS.

Czytaj więcej »

Implementacja weryfikacji obrazkowej CAPTCHA w GWT i JAAS

Istotnym problemem stron internetowych są nieproszone boty, które często uprzykrzają życie nie tylko administratorom serwisu, ale też użytkownikom, którzy chcieliby mieć dostęp do treści jak najwyższej jakości. Nic przecież tak nie drażni jak mnogość bezsensowych komentarzy z reklamami przy wpisie, dla którego np. toczyła się ciekawa dyskusja. Od lat podejmuje się próby rozróżnienia użytkownika będącego po drugiej stronie i stwierdzenia, czy mamy do czynienia z człowiekiem czy komputerem. Jednym ze sposobów jest zastosowanie CAPTCHA. Czy jest to sposób w pełni skuteczny? Jak się domyślasz, bądź wiesz – nie, jednak z pewnością eliminuje zdecydowaną większość mało zaawansowanych botów. Ważne jest też, aby CAPTCHA nie była zbytnim utrudnieniem dla właściwego użytkownika, bo nic tak nie irytuje, jak kilkukrotne odświeżanie obrazka, aby w końcu trafić na ten w miarę czytelny.

W niniejszym wpisie nie będę rozwodził się na temat skuteczności CAPTCHA, jak i przekonywał do używania tego typu zabezpieczenia lub nie. Nie chcę też sugerować konkretnego rodzaju zabezpieczenia, bo przecież oprócz najpopularniejszych  obrazków z mało czytelnymi literami i cyframi, istnieją jeszcze zabezpieczenia głosowe, czy takie polegające na wykonaniu jakiegoś zadania matematycznego, bądź inne bardziej wyrafinowane. Po prostu dostałem zadanie w firmowym projekcie polegające na implementacji weryfikacji obrazkowej i zanim się do tego zabiorę, postanowiłem nieco wcześniej rozeznać się w temacie.

Czytaj więcej »