Archiwa kategorii: 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 »

Eclipse Juno – nowa jakość IDE?

eclipse-juno-icon

Od poprzedniego wydania popularnego środowiska IDE, jakim jest Eclipse, minął trochę ponad rok. Eclipse Indigo (3.7) nie wprowadził jednak rewolucji, bo większość zmian od poprzedniej wersji to były poprawki błędów i aktualizacje modułów. Nieco lepiej działała „podpowiadaczka” (ctrl+space) i kilka innych drobiazgów, ale mimo wszystko nie odczułem jakiś większych różnic po przesiadce z Helios‚a (3.6). A jak jest tym razem?

Juno (a dokładniej 3 Juno lub Junona) – taką nazwę nosi jedna z planetoid krążących między Marsem a Jowiszem. Taką samą nazwę przyjął również nowy Eclipse. Co różni go od poprzednika? Przede wszystkim platforma. Juno oparty jest o platformę Eclipse 4.x rozwijaną już od dłuższego czasu, a obecnie noszącą numer 4.2. Ze zmian widocznych na pierwszy rzut oka przynosi ona przede wszystkim nowy, odmieniony wygląd, ale przede wszystkim zawiera szereg usprawnień, jak chociażby uniwersalną wyszukiwarkę, odłączane edytory, czy znacznie większe możliwości personalizacji poszczególnych elementów widoku.

Zmian jest jednak więcej. Jedną z ciekawszych jest nowy mechanizm Code Recommenders rozbudowujący możliwości „podpowiadaczki”. Gdy potrzebujemy jakiejś podpowiedzi, IDE sięga do bazy zawierającej najczęściej używane elementy i podpowiada nam np. sugerowane nazwy metod podając przy tym procent używalności danej metody. Oczywiście mechanizm zawiera algorytmy uczenia się, dzięki czemu powinien dostosować się do naszych nawyków i potrzeb.

Wygląda więc na to, że nowy Eclipse wprowadza nieco więcej zmian względem poprzedniej wersji, niż jego poprzednicy. Na ile okażą się przydatne, okaże się w praktyce. Mimo wszystko zawsze warto utrzymywać najnowszą wersję oprogramowania, więc zachęcam do pobierania.

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 »

Pobieranie plików z nazwami bez krzaków

Ostatnio w pracy toczę boje z serwisami REST i przy okazji tworzenia serwisu do upload‚u i download‚u plików natrafiłem na ciekawy, dawno temu utworzony przeze mnie zlepek kodu. Jako że czasami moja dawna twórczość mnie zachwyca, poniżej ten fragment zacytuję :)

public String encodeFilename(String filename, String userAgent) throws UnsupportedEncodingException {
  if (userAgent.contains("MSIE") || userAgent.contains("Opera")) {
    return URLEncoder.encode(filename, "UTF-8").replace("+", "%20");
  } else {
    return "=?UTF-8?B?" + new String(Base64.encodeBase64(filename.getBytes("UTF-8"))) + "?=";
  }
}

No i po co to komu? Ano po to, aby nadać pobieranemu plikowi nazwę z naszymi rodzimymi krzaczkami. Nie będę się zagłębiał w to, czemu tak jest, wystarczy wiedzieć, że prawie wszystkie przeglądarki nie odczytają poprawnie nazwy pliku przekazanej poprzez parametr nagłówka Content-Disposition. Co więcej, różnym przeglądarkom trzeba serwować zakodowaną nazwę pliku w nieco inny sposób.

Czytaj więcej »

Co nowego w Sencha GXT 3?

sencha-logo

Długo oczekiwana kolejna wersja Ext GWT ukazała się niedawno pod nową nazwą: Sencha GXT 3. Obsunięcie wydania było dość spore, bo jak dobrze pamiętam, pierwsze wzmianki o GXT 3 mówiły jeszcze o wakacjach 2011. Czy warto było czekać? Jakie zmiany przynosi nowa wersja? Zaraz się o tym przekonamy.

GXT 3 miało w założeniach skupić się na integracji z rozwiązaniami, które pojawiły się w GWT 2.x. Ext GWT 2 pojawiło się jeszcze za czasów GWT 1.5, gdzie takie dobrodziejstwa jak RequestFactory, UiBinder, Autobean, Code Splitting czy wiele innych, były dopiero w zamysłach twórców GWT. Ext GWT wprowadzało więc własne rozwiązania, niektóre dość ciekawe, np. wsparcie Java Beans za pomocą BeanModel’i. Z czasem jednak w GWT pojawiały się natywne mechanizmy, które rozwiązywały poszczególne problemy na nieco niższym poziomie, chociażby mechanizm Autobean, który jest silnie wykorzystywany przez GWT RequestFactory. Kod Ext GWT był jednak tak zaprojektowany, że korzystanie z nowych udogodnień było bardzo trudne albo zupełnie niemożliwe.

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 »