Получение NullPointerException с помощью row.setAttribute в Oracle ADF

Сейчас я пытаюсь изучить Oracle ADF и получаю исключение NullPointerException при выполнении следующего кода в Java-бине. Можете ли вы помочь мне понять, что я делаю неправильно, пожалуйста? Это вызывается с помощью кнопки на странице JSPX.

public String cb1_action() {
    try{
        BindingContext bindingctx = BindingContext.getCurrent();
        BindingContainer bindings = bindingctx.getCurrentBindingsEntry();
        DCBindingContainer bindingsImpl = (DCBindingContainer)bindings;
        DCIteratorBinding iter = bindingsImpl.findIteratorBinding("ViewObj1Iterator");


        Row row = iter.getCurrentRow();

        row.setAttribute("Id", 123);
        row.setAttribute("Nome", "Pedro Teste");

    }
    catch(Exception e) {
        System.out.println("Excepcao em: ");
        e.printStackTrace();
    }

    return null;
}

Судя по трассировке стека, ошибка возникает в первой строке row.setAttribute(). Кроме того, я использую последнюю версию JDeveloper со встроенным сервером WebLogic.

С наилучшими пожеланиями,

Педро


person Yaroze    schedule 12.10.2012    source источник
comment
row может быть null (т.е. getCurrentRow() возвращает null)!   -  person Eng.Fouad    schedule 12.10.2012
comment
отладьте и посмотрите, получаете ли вы --bindingsImpl.findIteratorBinding(ViewObj1Iterator);   -  person PbxMan    schedule 12.10.2012
comment
обычный сценарий, если вы делаете что-то не так, и вам нужно проверить свой разум на предмет проблемы. Но это может привести к плохой конструкции системы.   -  person Roman C    schedule 12.10.2012


Ответы (3)


Информация, на которой вы получаете сообщение об ошибке

row.setAttribute("Идентификатор", 123);

позвольте мне подумать, что вы пытаетесь изменить атрибут первичного ключа строки, что не разрешено. Не уверен в этом, поскольку вы не упомянули об ошибке, которую получили.

person Timo Hahn    schedule 12.10.2012
comment
Нет.. Дело было не в этом. Я пробовал без первичных ключей (только ROWID), и это тоже не сработало. Но спасибо за подсказку. - person Yaroze; 16.10.2012

Итак, вот как я понял, как обойти это:

Сначала я попросил jDeveloper сгенерировать класс для модуля приложения. В этом классе я добавил следующие методы:

public void testEntityObject()
{
    System.out.println("Let's try our Entity Object...");

    try
    {
        EntityDefImpl entity = TesteEOImpl.getDefinitionObject();
        TesteEOImpl ti = (TesteEOImpl)entity.createInstance2(getDBTransaction(), null);
        ti.setId(new BigDecimal(123));
        ti.setNome("Entity Object test...");

        getDBTransaction().commit();

        System.out.println("Looks good :-)");
    }
    catch(Exception e) 
    {
        System.out.println("It seems something went wrong :-(");
        e.printStackTrace();
    }
}

public void testViewObject() {
    System.out.println("Let's try our View Object...");

            ViewObjectImpl vo = this.getTeste1();

        try{
            Row row = vo.createRow();
            row.setAttribute("Id", 234);
            row.setAttribute("Nome", "VO test");
            vo.insertRow(row);
            getDBTransaction().commit();
            System.out.println("Looks good :-)")
        }
        catch(Exception e) {
            System.out.println("It seems something went wrong :-(");
            e.printStackTrace();
        }

    }

Эти методы вызываются управляемым компонентом, который подключен к двум кнопкам на странице. Этот управляемый компонент имеет следующие методы. Я опубликую только один из них, так как меняются только имена методов:

public String cb1_action() {

    try{
    FacesContext fctx = FacesContext.getCurrentInstance(); 
    BindingContext bindingContext = BindingContext.getCurrent();
    DCDataControl dc = bindingContext.findDataControl("AppModuleAMDataControl");
    AppModuleAMImpl am = (AppModuleAMImpl)dc.getDataProvider();


    am.criarTesteComEntityObject();
    }
    catch(Exception e) {
        e.printStackTrace();
    }

    return null;
}

Я знаю, что это не ракетостроение или что-то в этом роде, но мне потребовалось некоторое время, чтобы добраться туда... По сути, ваши ответы очень помогли мне пойти и выяснить, что происходит. Причина? Плохой дизайн! Предполагается организовать АДС... Всем спасибо! :D

person Yaroze    schedule 16.10.2012

person    schedule
comment
Это предотвратит создание исключений, но все равно не решит мою проблему... - person Yaroze; 16.10.2012