Технология (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 есть веб-интерфейс и консоль администратора