Java Vaadin,JPA持久单位注射行为非常奇怪

Java Vaadin,JPA持久单位注射行为非常奇怪,java,vaadin,ear,Java,Vaadin,Ear,我正在为web界面使用EJB、JPA和Vaadin开发EAR应用程序。应用服务器-GlassFish 3.1.1 文件dofaapplicationservlet.java package test.servlet; import com.vaadin.Application; import com.vaadin.terminal.gwt.server.AbstractApplicationServlet; import test.ejb.TestBean; import javax.ejb

我正在为web界面使用EJB、JPA和Vaadin开发EAR应用程序。应用服务器-GlassFish 3.1.1

文件dofaapplicationservlet.java

package test.servlet;

import com.vaadin.Application;
import com.vaadin.terminal.gwt.server.AbstractApplicationServlet;
import test.ejb.TestBean;

import javax.ejb.EJB;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

public class DofApplicationServlet extends AbstractApplicationServlet {
    @EJB
    private TestBean testBean;

    @PersistenceUnit(name="mainPU")
    private EntityManagerFactory emf;

    @Override
    protected Application getNewApplication(HttpServletRequest httpServletRequest) throws ServletException {
        return new DofApplication(testBean, emf);
    }

    @Override
    protected Class<? extends Application> getApplicationClass() throws ClassNotFoundException {
        return DofApplication.class;
    }
}
但是,在调试器中,我看到以下内容:

Ear文件结构

ear.ear
-- META-INF
---- application.xml
---- persistence.xml
-- ejb.jar
-- war.war
我想这个

protected Application getNewApplication(HttpServletRequest httpServletRequest) throws ServletException {
    return new DofApplication(testBean, emf);
}
。。。可能会在这里引起问题。容器将注入一个实体管理器工厂,该工厂对于后续请求可能不同。因此:如果创建DofaApplication实例并传入该emf,则可能会对无效的emf调用createEntityManager()

要测试这一点,您可以尝试在init()中获得这样的em:


将businesslogic放入EJB! 配置EJB:

•将persistence.xml放在那里

•对EntityManager等进行编程,并提供一些会话bean

•启用cdi(web和ejb)

•在web中提供扩展vaadin servlet类的webservlet(@webservlet注释)

@WebServlet(urlPatterns = "/*")
public class VaadinAppServlet extends AbstractApplicationServlet {

    @Inject
    VaadinApp application;

    @Override
    protected Class<? extends Application> getApplicationClass() throws ClassNotFoundException {
        return VaadinApp.class;
    }

    @Override
    protected Application getNewApplication(HttpServletRequest request) throws ServletException {
        return application;
    }
}



@SessionScoped
public class VaadinApp extends Application {
    //@Inject //if resource is annotated as @named
    @EJB //if resource is a session bean
}
@WebServlet(urlPatterns=“/*”)
公共类VaadinAppServlet扩展了AbstractApplicationServlet{
@注入
VaadinApp应用;
@凌驾

protected ClassNow它抛出异常javax.servlet.ServletException:javax.persistence.PersistenceException:EntityManager没有名为mainpuhmm的持久性提供程序…然后您的配置出现错误。请检查persistence.xml。检查容器的日志文件并查找PU的初始化。
protected Application getNewApplication(HttpServletRequest httpServletRequest) throws ServletException {
    return new DofApplication(testBean, emf);
}
EntityManagerFactory emf = Persistence.createEntityManagerFactory("mainPU");
em = emf.createEntityManager();
@WebServlet(urlPatterns = "/*")
public class VaadinAppServlet extends AbstractApplicationServlet {

    @Inject
    VaadinApp application;

    @Override
    protected Class<? extends Application> getApplicationClass() throws ClassNotFoundException {
        return VaadinApp.class;
    }

    @Override
    protected Application getNewApplication(HttpServletRequest request) throws ServletException {
        return application;
    }
}



@SessionScoped
public class VaadinApp extends Application {
    //@Inject //if resource is annotated as @named
    @EJB //if resource is a session bean
}