Як зробити так, щоб бібліотека dxejb.jar працювала без помилок?, Різне, Програмування, статті

Поява на ринку нового JBuilder 5.0 принесло розробникам EJB-додатків довгоочікуване полегшення. Нова бібліотека dxejb.jar з набором компонентів: SessionBeanConnection, EjbClientDataSet, EntityBeanProvider і EntityBeanResolver забезпечує досить зручне взаємодія клієнтської і серверних частин за допомогою спеціальних компонентів-перехідників, що становлять stateless session beans. Раніше, розробнику доводилося писати свої джерела даних. Це було досить незручно і забирало багато часу. Тепер, розробнику потрібно написати тільки перехідник на сервері, і він зможе скористатися стандартним EjbClientDataSet для підключення візуальних компонентів до EJB-джерела даних. Дані передаються у вигляді масивів, що також прискорює роботу клієнтського додатку.

Я не буду детально зупинятися на архітектурі бібліотеки dxejb.jar і прикладах її використання. Цю інформацію читач легко знайде в документації, що поставляється з JBuilder 5.0. Тут, мені б хотілося привернути увагу до тих помилок і неточностей, які допущені в цій бібліотеці, а також показати, як їх виправити.

1. Метод storeDataRowToEntityBean () у файлі EntityBeanresolver.java не перевіряє стовпці на значення NULL. Це призводить до того, що замість NULL в таблицю підставляються конкретні числові значення, наприклад, замість цілого NULL. підставляється 0. Це може викликати проблеми, якщо стовпець посилається на іншу таблицю і допускає значення NULL. В цьому випадку, присвоювання стовпцю 0 не завжди можливо, так як в таблиці на яку він посилається може бути відсутнім запис з первинним ключем 0. Зрозуміло, що з цієї ситуації завжди можна викрутитися, додавши відповідні “нульові” записи однак, це не можна вважати нормальним станом справ. Цей недолік можна легко виправити додавши в початковий текст перевірку на NULL:

int storeDataRowToEntityBean(DataRow dataRow, int index, EJBObject entityRemote) {
try {
Column column = dataRow.getColumn(index);
if ( !column.isReadOnly() ) {
String columnName = column.getColumnName();
if ( columnName.indexOf(.) == -1 ) {
Method setterMethod = methodsDesc.findSetterMethod(“set” + column.getColumnName());
if ( setterMethod != null ) {
if(dataRow.isNull(columnName))
{
setterMethod.invoke(entityRemote, new Object[] {null});
return 1;
}

}

}
catch(Exception ex) {…}

}

Оператор if () перевіряє значення поля і якщо воно дорівнює null, то викликається відповідний метод з параметром null.

2. Метод provideDataSets () з SessionBeanConnection.java містить серйозну помилку: не виділяється пам’ять під об’єкти parameterRowDataArray [i] і masterRowDataArray [i], після чого викликаються методи цих об’єктів! Якщо у випадку з masterRowDataArray [i] це не так страшно (зв’язок master-detail в даний час не використовується), то необхідність передавати параметри запиту на сервер виникає дуже часто. Зрозуміло, що така спроба закінчується винятком NullPointerException. В цьому випадку потрібно просто зробити те, що забули зробити розробники, а саме: виділити пам’ять під елементи масиву:

if ( parameterArray != null ) {
parameterRowDataArray = new RowData[parameterArray.length];
for (int i = 0; i < parameterArray.length; i++) {
if ( parameterArray[i] != null ) {
parameterRowDataArray[i] = new RowData();
parameterRowDataArray[i].load(parameterArray[i]);
}
}
}
if ( masterArray != null ) {
masterRowDataArray = new RowData[masterArray.length];
for (int i = 0; i < masterArray.length; i++) {
if ( masterArray[i] != null ) {
masterRowDataArray[i] = new RowData();
masterRowDataArray[i].load(masterArray[i]);
}
}
}

2. Однак, навіть після цих виправлень, передати параметр серверу виявляється не так то просто: передається тільки значення останньої колонки ParameterRow, інші значення виявляються порожніми! Справа в тому, що клас ParameterRow поводиться, на мій погляд, досить дивно: він вимагає, щоб розробник спочатку сформував всі стовпці викликами методу addColumn (), і тільки після цього привласнював їм значення! Мабуть, розробники класу RowData.java не здогадувалися про цю маленьку особливості ParameterRow (або його предків), тому написали дуже природний код, який написав би кожен нормальний людина на їх місці:

public ParameterRow extract() {
ParameterRow parameterRow = new ParameterRow();
for (int i = 0; i < values.length; i++) {
parameterRow.addColumn(names[i], values[i].getType());
parameterRow.setVariant(names[i], values[i]);
}
return parameterRow;
}

Але розробники ParameterRow, мабуть, не бажали своїм колегам легкого життя! Насправді, у світлі вищесказаного, код повинен виглядати наступним чином:

public ParameterRow extract() {
ParameterRow parameterRow = new ParameterRow();
for (int i = 0; i < values.length; i++) {
parameterRow.addColumn(names[i], values[i].getType());
}
for (int i = 0; i < values.length; i++) {
parameterRow.setVariant(names[i], values[i]);
}
return parameterRow;
}

Після виправлення цих помилок я перезібрати бібліотеку і замінив вихідний файл dxejb.jar своїм. Тепер бібліотека працює нормально.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*