Rafal M.

Rafal M. Software Engineer,
Monachium

Temat: Problemy z formularzami w JSF

Witajcie,

mam aplikacje w JSF (a dokladnie w MyFaces) + springframwork + hibernate.
Jest to bardzo prosta aplikacja, mianowicie jest lista rekordow. Jak klikne w ktorys rekord (lub wcisne przycisk NOWY) to mam formularz gdzie moge dodac nowy/modyfikowac istniejace rekordy. Po nacisnieciu ZAPISZ zapisuje zmiany do bazy danych i przechodzi spowrotem do listy.

Czasami (wzglednie rzadko) gdy nacisnie uzytownik ZAPISZ to zamiast zapisac i przejsc to laduje znowu w tym samym formularzu.

Jezeli dodaje nowy rekord to widze na nowo pusty formularz.
Jezeli modyfikuje isteniajcy to widze formularz ze "starymi" danymi (bez moim korektur).

Nie ma zadnego bledu ani wyjatku w logach.

Program jest mniej wiecej zbudowany w nastepujacy sposob:
ListBean - bean JSFowski, ktory zajmuje sie wyswietleniem listy rekordow.
ArticleBean - bean JSFowski, ktory zajmuje sie pojedynczym artykulem (rekordem). Tutaj zajmuje sie metoda action ZAPISZ

Gdy wyswietlamy rekord to wywolywane sa oba bean'y. Gdy nacisniemy na ZAPISZ to czasami zamiast wywolac akcje ZAPISZ to wywoluje tylko ListBean.
Podczas wywolywania tego beana to:
getQueryString(): null
getRequestURI(): /raport/article.html
getRequestURL(): http://blablabla.pl/raport/article.html

normalnie gdy wywoluje artykul to w QueryString musza byc pewne parametry. Natomiast tutaj ich nie ma.
Ciekawostka jest to, ze gdy jest to edytowanie istniejacego artykulu to pojawia sie jego "stara wersja" tj. bez naszych korektow.
Wyglada na to, ze JSF nie wywoluje akcji i cos zle wywoluje beany. Analizowalem kod dosc dokladnie ale nic nie znalazlem.
Probowalem z action oraz actionListener - bez rezultatu.

Niestety blad pojawia sie srednio 2-3 razy w tygodniu i nie udalo mi sie go zreprododukowac.

Niektre JARy, ktore uzywam:
el-api-1.0.jar
el-ri-1.0.jar
hibernate-3.2.1.ga.jar
jsf-facelets-1.1.11.jar
myfaces-api-1.1.3.jar
myfaces-impl-1.1.3.jar
servlet-api-2.4.jar
spring-2.0-rc2.jar
tomahawk-1.1.3.jar

Czy ktos ma pojecie co to moze byc ?

Pozdrawiam,
Rafal
Hubert M.

Hubert M. Senior Software
Developer - TMECC
Sp. z o.o.

Temat: Problemy z formularzami w JSF

Moze to byc problem walidacji/konwersji.

JSF przed wyslaniem formularza wykonuje tego typu operacje na polach (poczytaj o cyklach/fazach JSF, to jedna z faz przetwarzania JSF).
Wystarczy ze nie dodales dla pola formularza taga ktory ma wyswietlic informacje od walidatora/konwertera i bedzie wygladalo jakby submit nie dzialal. W zaleznosci od rodzaju problemu moze byc tak ze nigdy nie wyslesz danych, a moze byc tak ze tylko w szczegolnych przypadkach pojawi sie problem.
Sprobuj dodac np tag: messages (np. <t:messages> w zaleznosci jak mapujesz prefix, a pewnie 't' dla tomahawka), on agreguje komunikaty z calej strony jsf.
Nie jest to eleganckie (bo powinienes miec dla kazdego pola oddzielny message w stylu: 'nie podales hasla', 'nie podales nazwy uzytkownika' etc. - przy okazji mozna zmienic komunikaty na wlasne).

To powinno pokazac przyczyne zatrzymania przetwarzania formularza. Walidatory i konwertery raczej nie wyrzucaja wyjatkow, wykrywanie tego typu bledow jest ich normalnym dzialaniem, przy czym nie zawsze wykrywaja tak trywialne bledy jak puste pole, czy nieprawidlowy typ, czasem przydalby sie wyjatek, ale sie nie pojawi.

Z drugiej strony jak rozwijasz problem dalej w poscie, to sprawa zaczyna sie komplikowac, bo beany nie powinny zostac wywolane jezeli formularz nie przeszedl fazy walidacji. Ciezko analizowac tak bez kodu i bez mozliwosci debugowaniaHubert Moskwa edytował(a) ten post dnia 07.12.07 o godzinie 23:34



Wyślij zaproszenie do