Не очень опытно с использованием EJB, и я столкнулся со следующей проблемой, с которой, я надеюсь, один из вас, ребята, может помочь.
Предположим, что следующая ситуация: набор @Local
бинов был определен дляпредоставить доступ к базе данных.Эти компоненты очень просты и развернуты на сервере приложений A (Weblogic 10.3.3).Мы хотим предоставить доступ к этим локальным bean-компонентам через remote , и, поскольку у нас уже есть настройка модуля "services" для предоставления внешнего доступа к нашим услугам, наша идея заключалась в созданииновый сервис @Remote
, который использует локальные bean-компоненты, описанные выше (внедренный через @EJB
).Эти служебные бины также развертываются на сервере приложений A. Например:
@Local
public interface DatabaseBeanLocal { doStuff(); }
@Stateless(name = "ejb/DatabaseBean", mappedName = "DatabaseBean")
public class DatabaseBean implements DatabaseBeanLocal { doStuff() { ... } ; }
@Remote
public interface ServiceBean { doSomeOtherStuff(); }
@Stateless
public class ServiceBeanImpl implements ServiceBean
{
@EJB(name = "ejb/DatabaseBean", mappedName = "DatabaseBean")
private DatabaseBeanLocal myDatabaseBean;
... methods etc. ...
}
Клиент, который фактически будет использовать эти удаленные бины, фактически выполняется на другом сервере приложений; сервер приложений B (также Weblogic 10.3.3).Когда мы ищем bean-компонент ServiceBean
от нашего клиента, это прекрасно работает.Однако когда мы вызываем для него метод, которому требуется доступ к DatabaseBean
, вызов завершается неудачно.Сервер Weblogic сообщает, что не может найти компонент для интерфейса DatabaseBean
.
Мои вопросы: возможна ли такая настройка?Другими словами: будет ли Weblogic (или другой контейнер) внедрять локальный компонент в удаленный компонент, чтобы клиент получил экземпляр удаленного компонента, который способен вызывать действия с локальным компонентом (полагаю, нет, но я спрашиваюв любом случае, чтобы быть уверенным)?
Если нет, я думаю, у нас не будет другого выбора, кроме как пропустить уровень обслуживания и предоставить прямой доступ к приведенному выше примеру DatabaseBean
через @Remote
.
Обновление 1
После выполнения некоторых тестов просто определите DatabaseBean
выше как @Remote
вместо @Local
, чтобы «исправить» эту проблему.Конечно, это не совсем исправление, так как это будет вызывать DatabaseBean
удаленно, что смешно, потому что он находится в том же модуле, что и служба.Я начинаю подозревать, что обертывание локального EJB с удаленным EJB просто невозможно.
Обновление 2
То, что мы нашли до сих пор:
- До сих пор мы не смогли вручную внедрить локальный EJB-компонент, поскольку на самом деле мы не можем найти его во время выполнения.
- Очевидно, что Weblogic не включает локальные EJB-объекты в дерево JNDI.
- Вызов
ServiceBean
извне AS, на котором она развернута, все еще не работает, потому что зависимость от локального EJB никогда не разрешается или не разрешается на стороне клиента, что означает, что она не найдена.