Типовые ошибки и способы их исправления

Ошибка "No signature of method"

Причина

Ошибка может возникать при вызове методов с некорректными параметрами /аргументами.

Обобщенный вид полного текста ошибки:

No signature of method: ru.naumen.core.server.script.spi.ScriptUtils.название_метода() is applicable for argument types: (java.lang.String) values: передаваемые_параметры

Решения и примеры

Типовые примеры возникновения ошибки No signature of method:

  • utils.find

    findFirst

    count

    Решение:

    • В перечисленные методы вторым параметром необходимо передавать Map с атрибутами объектов, например, state или name.
    • В методы необходимо передавать пустую Map, если выборка по определенным атрибутам не нужна.

    Пример некорректного использования:

    utils.find('ou');

    Пример корректного использования:

    utils.find('ou', [:]);

    или

    utils.find('ou', ['title':'Отдел 1']);

  • load

    Решение: В метод load() необходимо передавать UUID нужного объекта, в случае отсутствия объекта метод будет возвращать null.

    Пример некорректного использования:

    utils.load('ou', [:]);

    Пример корректного использования:

    utils.load('ou$46456');

  • Date.plus

    Причина: Ошибка может возникать из-за неверного использования приращения времени.

    Решение: Перед добавлением некоторого количества дней к определенной дате необходимо убедиться, что добавляемое количество дней целого типа.

    Целое число должно быть типа int. Если это число будет, например, типа Long, то возникнет ошибка.

    Пример некорректного использования:

    def today = new Date();

    today + '5';

    Пример корректного использования:

    def today = new Date();

    today + 5;

  • addDays

    Правила использования метода addDays аналогичны правилам использования метода Date.plus.

    Пример некорректного использования:

    def today = new Date();

    api.date.addDays(today, '2');

    Пример корректного использования:

    def today = new Date();

    api.date.addDays(today, 2);

  • put

    Причина: Ошибка может возникнуть при неправильной передаче пары ключ-значение в Map.

    Решение: В метод put необходимо через запятую передавать один атрибут, затем его значение.

    Пример некорректного использования (ошибка заключается в том, что между атрибутом и значением — двоеточие):

    def param = [:];

    param.put('title':'someTitle');

    Пример корректного использования:

    param.put('title', 'someTitle');

Ошибка "Could not extract ResultSet"

  • Причина

    Ошибка может возникать из-за запросов с некорректными значениями параметров. Например, вследствие неправильного использования sp.ignoreCase() метода utils.find.

    Решение

    При использовании sp.ignoreCase() необходимо проверять корректность типов значений атрибутов, по которым происходит поиск. Решением проблемы является использование корректных типов значений атрибутов.

    Пример воспроизведения ошибки

    (атрибут number типа "Целое число")

    utils.find('serviceCall', ['number' : 1]); // не ошибка
    utils.find('serviceCall', ['number' : '1']); // не ошибка
    utils.find('serviceCall', ['number' : '1'], sp.ignoreCase()); // ошибка
    utils.find('serviceCall', ['number' : 1], sp.ignoreCase()); // не ошибка
  • Причина

    Ошибка может возникать в HQL запросе, если в него передается пустой список.

    Решение

    Для исправления ошибки необходимо добавить проверку списка на то, что он не пуст.

    Если list = null, то вернется пустой список, ошибки не будет.

    Пример воспроизведения ошибки

    def list = [];
    def query = """
    SELECT s.id
    FROM service\$slmService s
    WHERE s.id in (:list)""";
    return api.db.query(query).set('list', list).list();

    Если ошибка оборачивает ошибку в HQL запросе, то причина может быть указана в стеке как исключение-источник.

Ошибка "Сould not resolve property"

Причина

Ошибка может возникать при попытке обращения либо к вычислимому, либо к несуществующему атрибуту.

Полный текст ошибки:

Error in script. Hashcode: -235633005, error:
could not resolve property: isEmployeeActive of:
ru.naumen.core.server.bo.employee.Employee [SELECT find(distinct
a_1.id) FROM ru.naumen.core.server.bo.employee.Employee a_1
WHERE a_1.isEmployeeActive=:p_0

Решение

Вычислимый атрибут не хранится в базе данных, поэтому его нельзя использовать в качестве параметра в методах utils.count, utils.find, utils.findFirst и в HQL запросах.

Пример воспроизведения ошибки

Атрибут isEmployeeActive является вычислимым, поэтому отсутствует в базе данных.

utils.find('employee', ['isEmployeeActive' : true]);

Ошибка "Could not execute query, could not advance using next()"

Причина

Ошибка может возникать из-за запросов с некорректным синтаксисом. Первая ошибка возникает в методе findFirst, вторая в методе find.

Ошибки связаны с попыткой выборки по атрибутам типа "Ссылка на бизнес-объект" или "Набор ссылок на бизнес-объекты".

Решение

Корректное использование метода — вместо строки с названием нужного объекта задать его UUID.

utils.find('catalogs$bu', [item : 'item$2353453']);

utils.findFirst('catalogs$bu', [item : 'item$2353453']);

Пример воспроизведения ошибки

Атрибут item имеет значение типа "Ссылка на бизнес-объект" или "Набор ссылок на бизнес-объекты", 'Телефон' — простая строка.

utils.find('catalogs$bu', [item : 'Телефон']);

utils.findFirst('catalogs$bu', [item : 'Телефон']);

Ошибка "Loader not found for prefix"

  • Причина

    Ошибка может возникнуть в методах, в которых ожидается объект, а приходит строка.

    Решение

    Корректное использование метода: вместо "sample" указать объект или null, так как defaultValue — это объект, а не строка.

    Наличие значения с ключом 'metaClass' обязательно в карте атрибутов, иначе FxException.

    Пример

    При использовании метода utils.findUnique:

    def defaultValue = "sample";

    def obj = utils.findUnique(['title' : 'exampleTitle', 'metaClass' : 'ou'], defaultValue);

  • Причина

    Ошибка может возникать из-за неправильного использования метода utils.get().

    Решение

    Корректное использование метода:

    utils.get('ou$46456');

    Пример

    При использовании метода utils.get() может произойти ошибка, так как в метод необходимо передавать UUID определенного объекта.

    utils.get('ou');

Ошибка "Many objects in result"

Причина

Ошибка может возникать в методах, в которых должен вернуться один объект, а возвращается несколько.

Решение

Корректное использование метода.

Пример корректного использования

utils.get('ou$46456');

Пример некорректного использования

utils.get('ou', [:]);

В метод get необходимо передавать UUID нужного объекта.

Отличительная особенность метода get от load — в случае отсутствия объекта метод get выбросит исключение, а метод load вернет null. Такая ошибка будет только в том случае, если используется метод get с одним аргументом — UUID объекта. Если же используется метод get с мапой с параметрами, то в случае отсутствия нужного объекта вернется null.

Ошибка "Illegal attempt to dereference collection"

Причина

Ошибка может возникать, если в HQL-запросе у атрибута объекта берется атрибут (например, берется slmService, у него берется атрибут empProvServ, у которого, в свою очередь, берется атрибут id).

Полный текст ошибки:

Error in script. Hashcode: 2136679764, error:
illegal attempt to dereference collection [service_sl0_.id.empProvServ] with element property reference [id] [
SELECT s.empProvServ.id
FROM service$slmService s]

Решение

Для получения id атрибута empProvServ класса slmService такое использование будет неверным, необходимо использовать INNER JOIN или LEFT JOIN, если нулевые значения тоже необходимо учитывать.

Корректное задание запроса:

"""SELECT n.id
FROM service\$slmService s
INNER JOIN s.empProvServ n""";

Пример воспроизведения ошибки

def query = """
SELECT s.empProvServ.id
FROM service\$slmService s """;
return api.db.query(query).list();

Ошибка "ConnectException"

Причина

Ошибка возникает из-за проблем с подключением, например, из-за неправильной настройки файла dbaccess.properties.

Полный текст ошибки:

Error: ConnectException. Message: Connection refused: connect in script

Решение

Внести изменения в файл dbaccess.properties.

Изменить

sms.host//IP-address
sms.port//20002
sms.login//NSD
sms.password//NSD2019

на

sms.host=IP-address
sms.port=20002
sms.login=NSD
sms.password=NSD2019

Добавить строку:

sms.enquireLinkMillis=30000

После чего необходимо перезапустить приложение.

Ошибка "Редактируемый объект не содержит атрибуты"

Причина

Ошибка может возникать в скриптовом методе api.web.add(fqns, parent, attributes).

Полный текст ошибки:

При выполнении действия произошла ошибка: Редактируемый объект не содержит атрибуты '[fast]'

Решение

В SC_FQN указывать коллекцию fqn ( ['serviceCall$request']) и URL будет формироваться корректно.

Пример

Пример ошибочного скрипта, формирующего URL из атрибутов, в списке атрибутов также есть параметр fast: true.

Если в SC_FQN указывается ClassFqn добавляемого объекта, то получается ошибка.

def SC_FQN = 'serviceCall$request';
def attributes = [...
'clientOU' : user?.parent ?: cardObject?.clientOu,
'userName' : cardObject?.userName,
'fast' : true]; //атрибуты
def url = api.web.add(SC_FQN, subject?.UUID , attributes);
def gwt = api.web.getPlace(url);
result.goToUrl("#${gwt}", false);

Ошибка "Cannot get property 'UUID' on null object"

Причина

Ошибка может возникнуть при попытке получить атрибут нулевого объекта.

Решение

Для устранения ошибки требуется выяснить, у какого объекта берется параметр, в данном случае UUID, и добавить проверку на null.

Для упрощения поиска ошибки можно добавить в скрипт логирование вида:

logger.info("UUID calendar ${calendarUuid}");

Пример

В метод передается объект и необходимо вывести его UUID. В случае, когда по каким-либо причинам переданный объект = null, при попытке взять у него UUID (или другие атрибуты), будет возникать эта ошибка.

def testMethod (def subject)
{
subject.UUID;
}

Решение: добавить проверку объекта на null в том месте, где потенциально может возникнуть ошибка или же там, где она уже возникла. Проверка позволит избежать возникновения ошибки, если в метод придет нулевой объект.

В вышеприведенном примере в метод следует добавить:

def testMethod (def subject)
{
if (subject)
{
subject.UUID;
}
}

Ошибка "There is a cycle in the hierarchy"

  • Причина

    Ошибка может появиться при преобразовании Map с атрибутами в JSON. Она будет возникать при передаче в body Map, если присутствуют атрибуты "Ссылка на бизнес-объект".

    Решение

    В Map необходимо размещать только строковые атрибуты: UUID, title и т.д.

    Пример

    Есть скрипт, выполняющий запрос к внешней системе, в этом запросе requestContentType: JSON.

    Есть Map с атрибутами, которая будет передана в body:

    data = [
    street: subject.orderStreet,
    house: subject.orderBuilding,
    kv: subject.orderFlat,
    comment: subject.comments
    ];
  • Причина

    Ошибка будет возникать, если subject.comments является ссылкой на бизнес-объект или набором ссылок на бизнес-объекты.

    Решение

    Для решения проблемы следует в Map передать названия комментариев, то есть: subject.comments.title.

Ошибка "Wait for modules to be initialized"

Ошибка связана с режимами компиляции модулей OneByOne и All. При режиме компиляции All модули будут компилироваться сразу, что может повлечь ошибки.

  • Причина

    В разных модулях содержатся внутренние классы, названные одинаково, например, class Constants.

    Решение

    В dbaccess.properties измените режим компиляции с All на OneByOne, после чего перезапустите стенд. Модули будут компилироваться независимо друг от друга.

  • Причина

    Ошибка может возникать, если определенный класс был перенесен в другой пакет.

    Решение

    Если появляется ошибка вида:

    unable to resolve class org.apache.pdfbox.pdmodel.edit.PDPageContentStream

    то стоит проверить расположение класса, возможно его перенесли в другой пакет.

Ошибка "NullPointerExeption"

Проблема

При написании скрипта, который должен возвращать ссылку на определенный контент на карточке объекта, при простом выводе метода api.web.list не получается избежать ошибки NullPointerExeption.

Задача — сделать вычислимый при редактировании атрибут, который скриптом будет заполняться ссылкой на контент на карточке. Сейчас скрипт выглядит так:

if (subject != null){return(api.web.list(subject, 'kodKontenta'))
}

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

Решение

Если известен тип объекта, в котором контент доступен, то можно проверять form.metaClass в скрипте вычисления при редактировании.

Пример условия в скрипте:

Copy
if (form)
{
...
if (form.metaClass?.toString() == 'serviceCall$request')
{
return api.web.list(....
}
}

где serviceCall$request — тип, в котором доступен нужный контент.

Ошибка "PersistenceContext limit has been exceeded. Actual: 50002. Limit: 50000"

Причина

Ошибка возникает при попытке в скрипте получить более 50000 объектов в контекст.

Решение

При работе с большими коллекциями рекомендуется делить их на части и выполнять операции по очереди.