Используя NetBeans, я успешно выполнил пример корзины покупок, представленный в учебнике Java EE 6 на веб-сайте Oracle. Это EAR с двумя модулями: модуль EJB и клиентский модуль приложения. Я прервал некоторые детали кода, чтобы сосредоточиться на путаницах, с которыми я сталкиваюсь. Во-первых, ниже приведен код.Смутно об использовании @Remote в EAR
Удаленный интерфейс в модуле EJB
package cart.ejb;
import cart.util.BookException;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface Cart {
public void initialize(String person) throws BookException;
public void initialize(
String person,
String id) throws BookException;
public void addBook(String title);
public void removeBook(String title) throws BookException;
public List<String> getContents();
public void remove();
}
с состоянием сессионного компонента в модуле EJB
package cart.ejb;
import cart.util.BookException;
import cart.util.IdVerifier;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;
@Stateful
public class CartBean implements Cart {
List<String> contents;
String customerId;
String customerName;
public void initialize(String person) throws BookException {
.................
}
public void initialize(
String person,
String id) throws BookException {
.....................
}
public void addBook(String title) {
contents.add(title);
}
public void removeBook(String title) throws BookException {
.................
}
public List<String> getContents() {
return contents;
}
@Remove()
public void remove() {
contents = null;
}
}
Клиент в модуле клиентского приложения
package cart.client;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import cart.ejb.Cart;
import cart.util.BookException;
public class CartClient {
@EJB
private static Cart cart;
public CartClient(String[] args) {
}
public static void main(String[] args) {
CartClient client = new CartClient(args);
client.doTest();
}
public void doTest() {
..................
}
}
Теперь мои путаницы начинаются!
Confusion-1: В учебнике говорится, что это удаленный клиент. Но это не так! Он упакован как модуль в пределах того же EAR, что и модуль EJB. Не лучше ли @Local?
Путаница-2: Если GlassFish действительно считать его дистанционную связь между клиентом и бина сеанса, будет контейнер клиента поставить фальшивый экземпляр бина сеанса (т.е. прокси), представляющий фактическую экземпляр бина сеанса в контейнере EJB, как в «реальном» удаленном корпусе? Я имею в виду, удаленный дистанционный, неважно, что?
Confusion-3: Я подумываю о создании клиента в среде, отличной от EE, а затем получаю его для связи с bean-компонентом снаружи EAR, чтобы получить вкус «реального» пульта. Итак, если я запустил Eclipse и создаю клиентскую программу Java SE 7, скопировав содержимое с клиента в EAR, это те изменения, которые я должен внести?
Заменить инъекции зависимостей
@EJB
private static Cart cart;
с JNDI
private static Cart cart = (Cart) InitialContext.lookup("java:global/cart/cart-ejb/CartBean/Cart");
и добавить исходный код телеге интерфейса в проекте клиента Java Standard Edition.
Confusion-4: Я не могу найти местоположение этого файла EAR. На NetBeans я вижу, что под тележкой есть два файла jar. Но где же файл EAR? Я развернул проект, открыв его непосредственно с C: \ glassfish-4.1.1 \ docs \ javaee-tutorial \ examples \ ejb \ cart с NetBeans.
Конкретный порт со специальными полномочиями? Нужно ли это делать, если вместо создания клиентского приложения Java SE я просто вынул клиентский модуль приложения из EAR и запускался как автономный модуль для связи с модулем EJB, который был бы единственным модулем в EAR после того, как я вынул клиента? – softwarelover
Нет, в этом случае вам просто нужно сделать переносной JNDI-поиск из отделенного клиентского приложения (WAR будет делать все отлично, вам не нужно EAR для клиента, но обязательно упакуйте удаленные интерфейсы в нем, предпочтительно, как JAR lib) – highstakes