Jedną z bardziej denerwujacych rzeczy w pisaniu aplikacji Javovych (aplikacji webowych) jest ciągłe redeployowanie aplikacji celem sprawdzenia czy naniesione poprawki lub nowe funkcje działają poprawnie.
W językach skryptowych takich jak PHP, Ruby czy też świeży Grails dzieje się to w pełni automatycznie, zmienię część kodu, przechodzę do przeglądarki odświeżam i cieszę się, że działa (bądź nie). Continue reading ‘Wygodniejsze tworzenie aplikacji z JavaRebel’
Przed chwilą zdarzył mi się dziwny przypadek, wykorzystując zbudowany formularz dodawałem dane do bazy, jednak dane nie zawierały polskich znaków, zamiast nich były łagodnie mówiąc “krzaczki”, poprawiłem szybko krzaczki w bazie i zaczęły się poprawnie wyświetlać na stronie, problem więc nie był w samej bazie a w formularzu. Nastała chwila konsternacji gdyż sam spring został skonfigurowany pod utf-8 (ustawione kodowanie znaków) a dane przesyłane do bazy były w kodowaniu ANSI.
Po przeszukaniu internetu okazało się, że nie jestem sam, i aby wszystko zaczęło działać wystarczy ustawić filtr w pliku web.xml.
<filter>
</filter><filter -name>charsetFilter</filter>
<filter -class>org.springframework.web.filter.CharacterEncodingFi lter</filter>
<init -param>
<param -name>encoding</param>
<param -value>UTF-8</param>
</init>
<filter -mapping>
</filter><filter -name>charsetFilter</filter>
<url -pattern>/*</url>
I wszystko działa poprawnie.
Rozwiązanie znalezione na: http://forum.springsource.org
Jak ważne jest testowanie wie każdy programista, testy jednostkowe można pisać po stworzeniu aplikacji, lub co zalecane w trakcie jej tworzenia. Samo pisanie testów nie jest męczącym zajęciem o ile tworzymy niewielki projekt z odseparowanymi od siebie klasami. Problem zaczyna wzrastać do rangi misji niemożliwej gdy jedna klasa połączona jest z innymi klasami nie zawsze jawnie zadeklarowanymi jak to ma miejsce w aplikacjach opartych o Springframework.
W takim momencie z pomocą przychodzi nam adnotacja @ContextConfiguration zawarta w pakiecie org.springframework.test. Dzięki niej możemy bezpośrednio do naszej klasy testu jednostkowego podpiąć skonfigurowany wcześniej kontekst aplikacji zawierający zadeklarowany beany.
Continue reading ‘Springframework @ContextConfiguration – podpinamy kontekst do testów’
Tworzenie mojego projektu* rozpocząłem od zdefiniowania bazy danych, tabel w bazie oraz odpowiednich relacji między tabelami, na koniec dodałem sekwencje. Wszystko wygląda pięknie, i tak w teorii działa.
Jak każdy programista jestem leniwy, zamiast tworzyć mapowania w moim IDE o wiele lepiej wygenerować je wprost z bazy. W IntelliJ robi się łatwo o ile znajdziemy odpowiednią opcję o czym pisałem jakiś czas temu. Niestety szybko przekonałem się, że nie jest to idealne odwzorowanie moich tabel. Nie wiedzieć czemu IntelliJ zapomniał zaimportować sekwencje zadeklarowane w bazie, co skutkowało wystąpieniem szeregu błędów podczas prób zapisania danych w bazie, w szczególności wyróżnia się jeden:
org.springframework.web.util.NestedServletException: Request processing failed;
nested exception is org.springframework.orm.hibernate3.HibernateSystemException:
ids for this class must be manually assigned before calling save():
com.darekzon.coffeine.domain.Category;
nested exception is org.hibernate.id.IdentifierGenerationException:
ids for this class must be manually assigned before calling save():
com.darekzon.coffeine.domain.Category
Continue reading ‘@GeneratedValue oraz @SequenceGenerator – czyli sekwencje w hibernate’
Tworząc mój projekt stanąłem przed problemem którego nie potrafiłem rozwiązać, było to w miarę łatwe parsowanie przyjaznych linków celem wydobycia z nich parametrów. Spring 2.5.6 z którego korzystałem nie miał takiej możliwości (nie znalazłem rozwiązania), więc postanowiłem migrować projekt do najnowsze wersji tego frameworka a mianowicie do wersji 3.0.0 M3.
Z racji, że korzystam z mavena uznałem, że wystarczy zmienić wersje bibliotek w pliku POM.xml i wszystko ładnie będzie działać, niestety repozytoria które miałem skonfigurowane nie posiadały w swoich zasobach najnowszej wersji Spring-a.
Po szybkim przejrzeniu strony springframework.org szybko pobrałem konfigurację repozytorium Springa w którym przechowywane były najnowsze wersje bibliotek, niestety, po skonfigurowaniu tego repozytorium nie można było go zaktualizować (pobrać listy zawartości). Przeszukałem internet i nie znalazłem nic na ten temat, wpadłem natomiast na ciekawą aplikację jaką jest Nexus. Aplikacja pomaga nam utworzyć własne repozytorium, wymagając jedynie systemu operacyjnego z rodziny *Unix i maszyny wirtualnej javy, udostępniany jest też plik *.war, więc wszyscy użytkownicy, tomcata również znajdą coś dla siebie.
Tak więc utworzyłem na swoim serwerze vps repozytorium zawierające najnowszą wersję Springa, dodałem konfigurację do pliku POM.xml i wszystko działa, no prawie wszystko. Moje IDE nie widzi nowych wersji podczas wpisywania zależności, ale pobiera je poprawnie.
Dla wszystkich chętnych poniżej wstawiam konfigurację pliku POM.xml z moim repozytorium.
<repositories>
<repository>
<id>repo.a</id>
<url>http://mvn.darekzon.com/nexus/content/groups/public</url>
</repository>
</repositories>
Podczas pracy z Hibernatem oraz bazą PostgreSQL napotkałem się na dziwny błąd podczas wykonywania zapytania INSERT do bazy danych.
Gdy wysyłałem dane do bazy wyskakiwał poniższy błąd:
org.hibernate.exception.ConstraintViolationException:
Could not execute JDBC batch update
root cause
java.sql.BatchUpdateException:
Zadanie wsadowe 0 insert into public.user
(name, password, email, login, sureName, registerDate, payback, id) values ...
Rozwiązaniem/obejściem problemu jakie znalazłem jest wstawienie w pliku konfiguracyjnym hibernate-a (hibernate.cfg.xml) linijki:
<property name="hibernate.jdbc.batch_size">0</property>
Dzięki temu wszystko zaczęło ładnie działać, minusem jest zmniejszenie wydajności w obsłudze bazy danych, od teraz zapytania do bazy będą wysyłane pojedynczo a nie w grupie.
Jak ktoś zna lepsze rozwiązanie, z chęcią je poznam.
W poprzednim wpisie stworzyłem podstawowy projekt, nie posiada on żadnego kodu, bibliotek więc pora to nadrobić. Tym razem dodamy obsługę frameworków Spring oraz Hibernate a przy okazji zrzucimy schemat bazy danych do plików POJO (Plain Old Java Object – klasy czysto javove). Dzięki wsparciu dla wielu technologii IntelliJ Idea potrafi bardzo sprawnie podpowiadać składnię plików konfiguracyjnych, generować pliki, czy też ściągać odpowiednie biblioteki.
Żeby aplikację pisało się szybko i wygodnie warto dodać do projektu wsparcie dla frameworków. Aby to zrobić wystarczy wywołać okno “Framework Support” dostępne w menu projektu pod opcją “Add framework support“
Podczas zabaw z Grails spotkałem się z pewnym problemem, na moim serwerze podczas próby uruchomienia prostej Grails-owej aplikacji wyskakuje błąd:
Error executing script RunApp: : Error starting Sun's native2ascii:
gant.TargetExecutionException: : Error starting Sun's native2ascii:
Problem sprawia funkcja native2ascii konwertująca pliki zapisane w natywnym kodowaniu do kodowania UTF, aby pozbyś cię tego błędu wystarczy edytować plik Config.groovy znajdujący się w folderze twoj-projekt/grails-app/config.
Odnajdujemy tam linie:
grails.enable.native2ascii = true
i zamieniamy ją na:
grails.enable.native2ascii = false
Problem rozwiązany.
Czasami nachodzi nas ochota aby zamiast mozolnego wpisywania z ręki entity beans-ów lepiej użyć specjalnego importera, jakkolwiek w NetBeans oraz Eclipse jest on dostępny od ręki, tak w InteliJ Idea z niewiadomych względów został schowany przed ciekawskimi oczami.
Jeśli chcemy wygenerować sobie takie pliki, musimy w zakładce Pojects wybrać z listy “View as:” element “Java EE Structure”
Gdy już to zrobimy, należy przejść w gałęzi JPA Faces do PersistenceUnit i zaznaczając ją wywołać menu kontekstowe, na samym końcu będzie szukana przez nas opcja Generate Persistence Mappin.

W oknie które się pojawi możemy stworzyć nowe źródło danych, a przy okazji zaimportować schemat bazy do naszych Entity Beans-ów.

Okno generowania mapowania bazy danych
Jak zapewne wszyscy wiedzą, i jak pisałem w poprzednim wpisie, Google udostępniło w swoim App Engine obsługę języka Java. W tej chwili jest to wersja beta (dla 10k programistów którzy mieli refleks) ale niebawem wystartuje pełna wersja. Wraz z obsługą Javy Google udostępniło swoją bibliotekę JDK oraz plugin do eclipse.
Swoją przygodę z Java App Engine najlepiej rozpocząć od przeczytania poradnika który pokaże nam jak rozpocząć projekt, uruchomić go lokalnie a także wysłać na serwery Google. Continue reading ‘Google Java App Engine – pierwsze starcie’
Ostatnie komentarze