У меня развернуто корпоративное приложение A и B (в WLS 10.0). A - это «фреймворк», B - клиентское приложение. Клиент делает следующие звонки:
Object o = ctx.lookup(jndiName); // line 1
cf = (ConnectionFactory) o; // line 2
ConnectionFactory - это интерфейс, определяемый как:
public interface ConnectionFactory
extends java.io.Serializable, javax.resource.Referenceable {
...
}
Что происходит:
- Если jar, содержащий класс интерфейса, находится в системном пути к классам, строка 2 выполняется нормально
- Если интерфейсный класс не находится в системном пути к классам, но упакован с приложениями отдельно, строка 2 выдает исключение ClassCastException (в котором содержится информативный текст о том, что o является ConnectionFactoryImpl)
Почему это возможно? Я предполагаю, что поиск JNDI возвращает только заглушку для удаленного объекта (я прав в этом вопросе?), Тогда почему это имеет значение, если загрузчик классов интерфейса класса отличается?
Я ожидаю такого ответа:
- Да, это должно происходить так, как вы это переживаете, потому что ...
- Нет, этого не должно происходить, потому что если ... то ... значит, в вашей настройке есть что-то подозрительное.
- Ситуация, которую вы описали, очень странная, вы уверены, что где-то не упустили какой-то момент?
- ... :)
Также было бы неплохо, если бы кто-нибудь мог прояснить, как работают JNDI и заглушки, где происходит приведение (на стороне клиента на заглушке? Или на исходном объекте на удаленной стороне?) И т. Д.
Спасибо за вашу помощь!