Создайте EJB с двумя интерфейсами. @Local интерфейс для веб-модуля и интерфейс @Remote для локального приложения-клиента - PullRequest
1 голос
/ 21 июня 2011

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

@Stateless
public class CoreEJB implements CoreEJBRemote {

    @PersistenceContext(unitName = "CoreWeb-ejbPU")
    private EntityManager em;

    @Override
    public void packageProcess(String configFileName) throws Exception {
        //Process logics
    }

    @Override
    public <T> T create(T t) {
        em.persist(t);
        return t;
    }

    @Override
    public <T> T find(Class<T> type, Object id) {
        return em.find(type, id);
    }

    ...
}

Интерфейс Remote отсутствует в EAR и выглядит следующим образом

@Remote
public interface CoreEJBRemote {

    public void packageProcess(java.lang.String configFileName) throws java.lang.Exception;

    public <T extends java.lang.Object> T create(T t);

    public <T extends java.lang.Object> T find(java.lang.Class<T> type, java.lang.Object id);

}

Main клиента приложения ниже

public class Main {
    @EJB
    private static CoreEJBRemote coreEJB;

    public static void main(String[] args) {
        coreEJB.packageProcess("path/to/a/file");
    }
}

Теперь я хочу создать интерфейс Local для EJB, чтобы в Managed Bean моего веб-модуля я мог получить доступ к EJB через локальный вызов.

Могу ли я просто изменить CoreEJB с public class CoreEJB implements CoreEJBRemote на public class CoreEJB implements CoreEJBRemote, CoreEJBLocal и создать @Local интерфейсный вызов CoreEJBLocal внутри EJB package? Или будет что-то лишнее? Я хочу, чтобы код моего управляемого компонента был таким

@ManagedBean
@RequestScoped
public void testView{
    @EJB
    private CoreEJBLocal coreEJB;

    public void add(Something something){
        coreEJB.add(something); //Local invocation
    }
}

1 Ответ

1 голос
/ 21 июня 2011

Должен ли я просто поменять CoreEJB с публичного? класс CoreEJB реализует CoreEJBRemote в открытый класс CoreEJB реализует CoreEJBRemote, CoreEJBLocal и создать @Local интерфейс вызова CoreEJBLocal внутри EJB-пакета?

Да, этого должно быть достаточно. Ты пробовал? Это не удалось? Помните, что локальные интерфейсы передаются по ссылке, а удаленные интерфейсы передаются по значению. Если вызывающие (или bean-компоненты) изменяют состояние возвращаемого значения (или аргументов, соответственно), то между ними будет другое поведение. Вы должны соблюдать осторожность в контракте API.

...