【问题标题】:EntityManager injection not working with Tomcat + OpenEJBEntityManager 注入不适用于 Tomcat + OpenEJB
【发布时间】:2012-08-16 03:55:28
【问题描述】:

我正在使用 NetBeans IDE 7.1、Apache Tomcat 6.0.26、OpenEJB 3.0 和 JSF 2.0。首先,我将openejb.war 插入文件夹:Apache Tomcat 6.0.26\webapps。看起来 Tomcat 服务器工作正常,因为在运行项目后 Tomcat 服务器会记录:

Apache OpenEJB 3.0    build: 20080408-04:13
http://openejb.apache.org/

这是我的代码:

性别管理器

@Stateless
public final class GenderManager {
    private final static String QUERY_GET_GENDER = "from Gender gender";
    @PersistenceContext(unitName="ExampleWebPU", name="ExampleWebPU")
    private EntityManager em;
     public List<Gender> getAllGender() {
        try {
            Query query = em.createQuery(QUERY_GET_GENDER);
            return query.getResultList();
        } catch (Exception e) {
            return null;
        }
    }
}

性别控制器

@ManagedBean
@RequestScoped
public class GenderController {
    @EJB
    private GenderManager gm;  
    public List<Gender> getAllGender() {
        return gm.getAllGender();
    }
}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="ExampleWebPU" transaction-type="JTA">
    <jta-data-source>java:openejb/Resource/db1</jta-data-source>
    <non-jta-data-source>java:openejb/Resource/db1</non-jta-data-source>
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <properties>
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(foreignKeys=true" />
            <property name="openjpa.jdbc.SchemaFactory" value="native(foreignKeys=true)" />
            <property name="openjpa.jdbc.MappingDefaults"
                value="ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict" />
            <property name="openjpa.Log" value="DefaultLevel=TRACE,SQL=TRACE" />
    </properties>
  </persistence-unit>
</persistence>

openejb.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<Context>
  <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1,0:0:0:0:0:0:0:1(%.*)?" deny=""/>
   <openejb>
    <Resource id="db1" type="DataSource">
      JdbcDriver com.mysql.jdbc.Driver
      JdbcUrl jdbc:mysql://localhost:3306/example_db1
      UserName root
      Password root
      JtaManaged true
    </Resource>
    <Resource id="db2" type="DataSource">
      JdbcDriver com.mysql.jdbc.Driver
      JdbcUrl jdbc:mysql://localhost:3306/example_db2
      UserName root
      Password root
      JtaManaged true
    </Resource>
  </openejb>
</Context>

我没有添加额外的代码。当GenderController 中的gm.getAllGender() 行尝试执行时,出现以下异常:

javax.el.ELException: /register.xhtml @50,119 value="#{genderController.allGender}": Error reading 'allGender' en el tipo com.example.GenderController
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UISelectItems.getValue(UISelectItems.java:129)
    at com.sun.faces.renderkit.SelectItemsIterator.initializeItems(SelectItemsIterator.java:202)
    at com.sun.faces.renderkit.SelectItemsIterator.hasNext(SelectItemsIterator.java:135)
    at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:762)
    at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:844)
    at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:298)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
    at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
    at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
    at com.example.GenderController.getAllGender(GenderController.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)

这是怎么引起的,我该如何解决?

【问题讨论】:

    标签: tomcat netbeans jsf-2 openejb


    【解决方案1】:

    不应将 EJB 类声明为 final。我想知道您是如何编译 GenderManager Stateless 类的。 从GenderManager 类定义中删除final

    【讨论】:

    • 感谢 perissf 的回答。我已经删除了课程的决赛,但没有工作:S.
    • 之前的代码编译好了,至少nettbeans没有给我任何错误或警告,但是很高兴知道一个EJB类不能是final的。我是网络世界的新手。还是谢谢...还有什么建议吗?
    • 这很好奇,因为 NetBeans 给了我一个警告。无论如何,其余的看起来都很好。试试吧。如果您有其他问题,请提出新问题。如果此答案解决了您的问题,请将其标记为已接受。
    • perissf ,我修改了代码但没有工作:S。我不知道我是否需要在服务器中进行更多修改。我认为我的persistence.xml 或openejb.xml 有问题(或遗漏)
    • 我不是 openejb 方面的专家。但是在persistence.xml 中,您不能同时使用jta-data-sourcenon-jta-data-source 引用相同数据源的属性。尝试删除第二个。你在看教程吗??
    【解决方案2】:

    您使用的 OpenEJB 版本已有 4 年历史。我不认为我们在 3.1 版之前添加了 JSF 支持——如果我没记错的话。

    我真的建议您尝试最新版本的 Tomcat/OpenEJB 堆栈,TomEE http://openejb.apache.org/download.html

    我们基本上采用了您正在使用的代码并完成了所有功能,并通过了 Java EE 6 TCK 并对其进行了官方认证。我们更改了名称,因为将其命名为“Tomcat/OpenEJB”对于经过认证的服务器来说有点误导。但这都是相同的开发人员和相同的代码(更好的代码版本......也许更好的开发人员版本:)。

    【讨论】:

    • 感谢大卫·布莱文斯的回复。我不知道那个版本这么旧而且不支持 JSF。但是我现在有另一个问题:S ...也许你可以帮助我。我尝试使用TomEE 1.0.0 的版本,但我无法运行它,因为:code GRAVE: Excepción enviando evento inicializado de contexto a instancia de escuchador de clase com.sun.faces.config.ConfigureListener java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.openejb.jsf.CustomApplicationFactory 你知道这个版本是否支持JSF 2.0?提前致谢
    • 支持JSF 2.0。作为一个新问题发布,我会跟进。我们应该能够让它工作。
    • 您可能只需要从应用程序中删除 JSF 实现并在服务器中使用它。
    • 你好大卫,究竟是什么意思从应用程序中删除 JSF 实现并使用服务器中的那个?在我的 web.xml 文件中修改&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;?对不起这个问题,但我对这个网络世界很新鲜:S.
    • 啊大卫,我已经发布了这个问题。 stackoverflow.com/questions/12202224/…非常感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多