Ну, я в значительной степени понял это сам.
Проект SharedInterfaces определяет интерфейсы, которые обычно используются, и когда я хочу сделать LocalInterface для EJB, я просто оставляю этот интерфейс пустым и расширяю тот, который я определил для SharedInterfaces. Контейнер, кажется, обрабатывает все правильно, потому что интерфейс - это все-таки локальный интерфейс (вроде).
Просто для ясности я добавлю простой пример того, что я сделал. Это локальный интерфейс, который я создаю для EJB:
package org.myapp.managers;
import javax.ejb.Local;
@Local
public interface UserManagerLI extends IUserManager{
}
Затем в SharedInterfaces я просто добавляю интерфейс IUserManager:
public interface IUserManager {
public IUser newUser();
public void saveOrUpdate(IUser u, boolean hashPass);
public void deleteUser(IUser u);
public boolean checkUserAvailability(String username);
public IUser getUser(String username);
}
Затем, чтобы использовать его, я просто сделал инъекцию как обычно:
@ManagedBean
@SessionScoped
public class LogInBean {
@EJB
private IUserManager userManager;
// Attributes, Setters, Getters and methods
}
Конечно, нужно ВСЕГДА быть осторожным с тем, что он разоблачает. Думая об интерфейсах как о контрактах на обслуживание, нельзя иметь доступ к функциям, к которым он не имеет доступа.