JSONObjects не работает с регистрацией osgi, не как аргумент функции, ни как return - PullRequest
0 голосов
/ 15 января 2019

Я работаю со средой knopflerfish, где я пытаюсь использовать функции из удаленного объекта с помощью ServiceRegistration. Я объясню в качестве примера. Я создал две связки, A и B . Пакет B имеет класс C , где я реализовал два метода:

public void printIt(JSONObject toPrint) {
    logger.debug(toPrint);
}

public void printIt(String toPrint) {
    logger.debug(toPrint);
}

public JSONObject returnedJ() {
    return (new JSONObject());
}

public String returnedM() {
    return "hello";
}

Этот класс C инициализируется в активаторе B и регистрируется с помощью ServiceRegistration, поэтому его можно использовать в качестве удаленного объекта из пакета A . Активатор A просто получает зарегистрированный объект C , чтобы использовать его методы, и здесь возникает проблема. Удаленный объект может использоваться, но только методы, которые используют String, работают, а JSONObject - нет. Это случилось с кем-нибудь? Что может быть объяснением?

Я протестировал это поведение, отлаживая и используя try / catch, и ошибки не отображаются. Также нужно сказать, что при использовании методов JSONObject пакет A зависает и в методе нет сигнала из класса C . Сейчас я буду анализировать объекты из JSONObject в String в комплекте A и из String в JSONObjects в комплекте B , но это все еще меня раздражает.

PD: я использую org.codehaus.jettison.json.JSONObject .

Заранее спасибо.

1 Ответ

0 голосов
/ 16 января 2019

В комментариях спрашивающий уточнил, что библиотека, предоставляющая тип org.codehaus.jettison.json.JSONObject, была скопирована / встроена в оба пакета.

Встраивание может использоваться для библиотек, которые используются полностью в пакете, но никогда для типов, которые могут совместно использоваться между пакетами, например, как часть API. Это связано с тем, что в Java идентификатор типа является комбинацией его полностью определенного имени и загрузчика классов, который его определил. Следовательно, тип JSONObject, определенный одним пакетом, отличается от типа JSONObject, определенного другим пакетом, даже если они идентичны с точки зрения байт-кода. Если бы вы попытались загрузить экземпляр одного в переменную, которая ожидает другого, вы бы увидели ClassCastException с сообщением вида «JSONObject не может быть приведен к JSONObject».

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

...