Как получить доступ к EJB, реализующему удаленный интерфейс, в отдельном веб-приложении? - PullRequest
2 голосов
/ 10 марта 2010

Я использую Netbeans 6.8 и Glassfish v3.0.

Я создал модуль ejb и создал классы сущностей из базы данных, а затем создал сессионный компонент без сохранения состояния с удаленным интерфейсом. Скажем, например.

 @Remote
public interface customerRemote{
    public void add(String name, String address);
    public Customer find(Integer id);
}

@Stateless
public class customerBean implements customerRemote{
    //implementations of methods
}

Затем я создал новое веб-приложение. Но теперь, как мне получить доступ к удаленным ejb в моем веб-приложении. Я мог бы найти bean-компонент с именем jndi, но я хочу знать, какой тип объекта он будет возвращать? Как я могу ввести его в customerRemote? В моем веб-приложении нет класса с именем customerRemote. Итак, как мне это сделать? Кроме того, как насчет сущности класса Customer? В моем веб-приложении также нет такого класса с именем Customer. Все классы ejb и entity находятся в отдельном модуле ejb. Пожалуйста, помогите мне: (

Ответы [ 2 ]

11 голосов
/ 10 марта 2010

Как мне это сделать? customerRemote? У меня нет никакого класса назвал customerRemote в моем вебе приложение. Итак, как мне это сделать? Также, как насчет сущности класса Customer? Нет такого класса с именем Customer в моем веб-приложении также. Все ejb's и классы сущностей находятся в отдельном ejb модуль.

Ваше веб-приложение должно зависеть от библиотеки, которая содержит эти классы и интерфейсы. После этого вы сможете импортировать интерфейс и typecast как обычно. У вас есть два подхода:

  • Все в одной банке . Похоже, это то, что у вас есть сейчас. В этом случае ваше веб-приложение должно зависеть от этой банки.

  • Разделение API и реализация . Лучше всего разделить ваш модуль ejb на две банки: одна jar myModule-api содержит классы, которые принадлежат API вашего модуля. В этом случае это будет customerRemote и Customer. И еще один jar myModule-impl содержит реализацию (реализация зависит, конечно, от API). Тогда в вашем веб-приложении вам нужно только зависеть от API, который находится в myModule-api.

1 голос
/ 13 марта 2010

Я использую Eclipse 3.5.2, EJB 3.0 и GlassFish 2.1, но я уверен, что это будет работать и для вас.

Ну, во-первых, я создал EJB-проект, который будет развернут как отдельный EJB-модуль в контейнере, и еще один проект, который фактически является веб-приложением, использующим один сервлет для тестирования.

Я могу решить ту же проблему, добавив следующие параметры в объявление @EJB в сервлете, который вызывает bean-компонент:

public class SimlpeServletClient extends HttpServlet {
.
.
.
@EJB(beanInterface=ISimpleJob.class,mappedName="ISimpleJob")
ISimpleJob statelesBean;
.
.
.
protected void doPost(HttpServletRequest ...){...}

.
.
.
}

И это структура компонента, реализующего интерфейс, предоставляемый сервлету:

@Stateless(name="SimpleJobBean", mappedName="ISimpleJob")
@Remote( { ISimpleJob.class })
public class SimpleJobBean implements ISimpleJob {
.
.
.
}

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

...