Java EE 6: Как добавить веб-модуль поверх клиента приложения

Технология (Java EE 6 с Glassfish 3.1, Netbeans 7.0)

У меня есть клиент приложения, который обращается к базе данных через JPA. Нет EJB задействован. Теперь мне нужно добавить веб-интерфейс для этого клиента приложения. Поэтому я выберу JSF 2.x . Здесь меня беспокоит дизайн, и я надеюсь, что сообщество поможет мне. Благодаря BalusC я могу использовать JPA в автономном клиентском приложении , указав тип транзакции = RESOURCE_LOCAL в файле persistence.xml. Ниже приведена демонстрация:

ИЗМЕНИТЬ приведенные ниже коды были отредактированы на основе предложения BalusC

Вот мой Клиент приложения main

public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("CoreInPU");
    EntityManager em = emf.createEntityManager();
    EntityDAO entityDAOClient = new EntityDAOClient(em);
    Main pgm = new Main();
    try {
        process(entityDAOClient);
    } catch (Exception e) {
        logger.fatal("", e);
    }finally{
        em.close();
        emf.close();
    }
}

public void process(EntityDAO entityDAO){
    validatePDF(List);
    processPDF(List, entityDAO);
    createPrintJob(List, entityDAO);
}

public void processPDF(List, EntityDAO entityDAO){
    for(File file : pdfFiles){
        entityDAO.create(file);
    }
}

Вот мой класс интерфейса DAO в моем Клиент приложения

public interface EntityDAO {
    public  T create(T t);
    public  T find(Class type, Object id);
    public List findWithNamedQuery(String queryName);
    public List findWithNamedQuery(String queryName, int resultLimit);

}

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

public class EntityDAOClient implements EntityDAO {

    private EntityManager em;

    private static Logger logger = Logger.getLogger(EntityDAOClient.class);

    public EntityDAOClient(EntityManager em) {
        this.em = em;
    }

    @Override
    public  T create(T t){
        em.getTransaction().begin();
        em.persist(t);
        em.getTransaction().commit();
        return t;
    }

    @Override
    public  T find(Class type, Object id){
        em.getTransaction().begin();
        T t = em.find(type, id);
        em.getTransaction().commit();
        return t;
    }
    ...
}

А вот persistence.xml


   org.eclipse.persistence.jpa.PersistenceProvider
   com.wf.docsys.core.entity.Acknowledgement
   com.wf.docsys.core.entity.PackageLog
   
      
      
      
      
      
   

Теперь мне нужно добавить поверх него веб-модуль. Я знаю, что мне нужен тип транзакции JTA , поэтому я создаю вызов проекта EAR foo с foo_ejb и foo_war в нем. Итак, мой EJB выглядит так:

@Stateless
@LocalBean
public class CoreEJB implements EntityDAO{

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

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

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

    ...
}

Обратите внимание, что CoreInWeb-ejbPU - это новое имя модуля persistence.xml с типом транзакции JTA . Я также добавляю jar-файл своего клиента приложения в пакет foo_ejb . При развертывании я получил следующее сообщение Недопустимый файл ejb jar [foo-ejb.jar]: он содержит ноль ejb. Именно из-за этого открытый класс @Stateless CoreEJB реализует EntityDAO . Если я возьму реализует EntityDAO , тогда он будет развернут, но мне нужно, чтобы EJB был реализован EntityDAO , чтобы в моем управляемом bean-компоненте я мог это сделать

@ManagedBean
@RequestScoped
public class Bean {

   @EJB
   private CoreEJB coreEJB;


   public Bean() {

   }

   public void runAppClientMainProcess() { 
       //The web interface can also kick off the same process as the app client
       process(coreEJB);
   }

   // ...
}

Как я могу сделать это правильно? Пожалуйста, помогите

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

7
задан Community 23 May 2017 в 11:59
поделиться