Archive for the 'J2EE' Category

Wygodniejsze tworzenie aplikacji z JavaRebel

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’

Spring framework – formularz i polskie litery (utf-8)

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

Springframework @ContextConfiguration – podpinamy kontekst do testów

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’

@GeneratedValue oraz @SequenceGenerator – czyli sekwencje w hibernate

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’

Maven i Spring 3.0.0 M3

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>

Hibernate nie chce zapisać rekordu w bazie? Problem z BatchUpdateException

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.

IntelliJ i wsparcie dla frameworków + baza danych

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

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. Continue reading ‘IntelliJ i wsparcie dla frameworków + baza danych’

Grails i błąd native2ascii

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.

InteliJ Idea – importowanie schematu bazy do Entity Beans

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

Wybór widoku struktury JavaEEGdy 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.

Plik PersistenceUnit który trzeba zaznaczyć

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

Okno generowania mapowania bazy danych

Google Java App Engine – pierwsze starcie

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’