W tym tygodniu spędziłem parę godzin na znalezieniu problemu, czemu nagle po wgraniu patch'a na serwer aplikacyjny Oracle'a przestała działać jedna z funkcji. Wyglądała mniej wiecej tak:
public void addDepartment(Number deptno, String dname, String loc){
ViewObject depts = getDeptView();
Row newDept = depts.createRow();
newDept.setAttribute("Deptno", deptno);
newDept.setAttribute("Dname" , dname);
newDept.setAttribute("Loc" , loc);
getDBTransaction().commit();
}
czyli nie robiła nic nadzwyczajnego poza zapisem wiersza do tabeli w bazie. Problem oczywiście odnalazł się w logach serwera. Po zrobieniu upgrade'u z wersji 10.1.3.3 do wersji 10.1.3.5 okazało się, że identyfikator sesji nie ma już 44 znaków tylko 64, a moja funkcja zapisywała ten identyfikator do bazy. Niestety framework nie propagował tego wyjątku do warstwy widoku-controlera i nie dodawał go do kolejki FacesMeassages. Oczywiście prawidłowo napisana funkcja w module aplikacji powinna wyglądać następująco:
public void addDepartment(Number deptno, String dname, String loc){
ViewObject depts = getDeptView();
Row newDept = depts.createRow();
newDept.setAttribute("Deptno", deptno);
newDept.setAttribute("Dname" , dname);
newDept.setAttribute("Loc" , loc);
try{
getDBTransaction().commit();
}catch(JboException ex){
getDBTransaction().rollback();
throw new JboException(ex);
}
}
Jak widać, wbrew marketingowi, Oracle ADF nie robi za nas wszystkiego :). Warto o tym pamiętać, szczególnie wywołując procedury PL/SQL.