niedziela, 10 października 2010

ADF Business Components i zatwierdzanie transakcji - problem z obsługą wyjątków

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.