java - @无状态空指针异常

标签 java apache-tomee ejb-3.2

我是 EJB3 新手。

我已经创建了一个 dao 用户。

@Entity
@Table(name = "t_user")
public class User implements Serializable {

    @Column(name = "name")
    private String name;

    private String street;
    private int houseNumber;

    @Column(name = "email") 
    private String email;
//... getters and setters

}

无状态 EJB:

@Stateless
public class ItemFacade implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @PersistenceContext(unitName = "databaseName")
    private EntityManager em;

    public void create(User user) {
        em.persist(user);
    }
}

托管 bean:

@ManagedBean
@ViewScoped
public class UserBean implements Serializable {
    private User user = new User();
    @EJB
    private ItemFacade itemFacade;
    public void save(){       
        itemFacade.create(this.user);
    }
    //....
}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
        <persistence-unit name="my-unit" >
          <jta-data-source>TestDS</jta-data-source>
        </persistence-unit>
</persistence>

以及tomee.xml

<?xml version="1.0" encoding="UTF-8"?>
<tomee>
  <!-- see http://tomee.apache.org/containers-and-resources.html -->

  <!-- activate next line to be able to deploy applications in apps -->
  <!-- <Deployments dir="apps" /> -->
    <Resource id="TestDS" type="DataSource">
      JdbcDriver com.mysql.jdbc.Driver
      JdbcUrl jdbc:mysql://localhost:3306/databaseName
      UserName username
      Password password
      JtaManaged true
    </Resource>
</tomee>

但是当我尝试将用户保存在行中时,我得到了NullPointerException:

itemFacade.create(this.user);

任何帮助将不胜感激。

完整的堆栈跟踪是:

ADVERTENCIA: java.lang.NullPointerException
javax.el.ELException: java.lang.NullPointerException
    at org.apache.el.parser.AstValue.invoke(AstValue.java:291)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:813)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:931)
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:105)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at managedBeans.UserBean.create(UserBean.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    ... 34 more

如何创建一个不为空的 EntityManager?

最佳答案

看起来您的实体管理器没有被注入(inject)。

改变 @PersistenceContext(unitName = "databaseName")

@PersistenceContext(unitName = "my-unit")

因为它应该与您的 persistance.xml 中的内容相匹配 <persistence-unit name="my-unit" >

关于java - @无状态空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30384619/

相关文章:

JavaFX 高度调整问题

java - 汤姆EE : Forwarding request to a different war

java - TomEE 中的 Tomcat 7 不维护 session ;未发送 JSESSIONID cookie

java - 从生产环境中删除日志

java - 避免在 wildfly 中运行的 EJB 调度中的计时器重叠

java - 数据库单元应该忽略行的顺序

Java:模拟调用外部库来测试构造函数

java - 用 Java 编写和比较日期

authentication - tomcat 7 web.xml 层次结构 - 用户和角色 - java servlet

java - WildFly:来自远程客户端的 EJB 调用