【问题标题】:NullPointerException in JPAJPA 中的 NullPointerException
【发布时间】:2012-02-25 18:07:42
【问题描述】:

我正在使用 jpa 创建一个 Java EE 应用程序。

在服务器上运行代码时出现以下错误

    [2/25/12 22:56:31:371 IST] 00000047 SystemOut     O hello
    [2/25/12 22:56:31:375 IST] 00000047 SystemOut     O Error...:(
    [2/25/12 22:56:31:371 IST] 00000047 SystemErr     R java.lang.NullPointerException
    [2/25/12 22:56:31:371 IST] 00000047 SystemErr     R     at plh.service.ejb.UserBean.getUserDetails(UserBean.java:41)
    [2/25/12 22:56:31:372 IST] 00000047 SystemErr     R     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [2/25/12 22:56:31:372 IST] 00000047 SystemErr     R     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
    [2/25/12 22:56:31:372 IST] 00000047 SystemErr     R     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    [2/25/12 22:56:31:372 IST] 00000047 SystemErr     R     at java.lang.reflect.Method.invoke(Method.java:599)
    [2/25/12 22:56:31:372 IST] 00000047 SystemErr     R     at com.ibm.etools.utc.model.ReflectionMethodModel.invoke(ReflectionMethodModel.java:65)
    [2/25/12 22:56:31:372 IST] 00000047 SystemErr     R     at com.ibm.etools.utc.servlet.InvokeServlet.invoke(InvokeServlet.java:113)
    [2/25/12 22:56:31:372 IST] 00000047 SystemErr     R     at com.ibm.etools.utc.servlet.InvokeServlet.doPost(InvokeServlet.java:374)
    [2/25/12 22:56:31:373 IST] 00000047 SystemErr     R     at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
    [2/25/12 22:56:31:373 IST] 00000047 SystemErr     R     at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    [2/25/12 22:56:31:373 IST] 00000047 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1443)
    [2/25/12 22:56:31:373 IST] 00000047 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:790)
    [2/25/12 22:56:31:373 IST] 00000047 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:443)
    [2/25/12 22:56:31:373 IST] 00000047 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:175)
    [2/25/12 22:56:31:373 IST] 00000047 SystemErr     R     at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)
    [2/25/12 22:56:31:373 IST] 00000047 SystemErr     R     at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:859)
    [2/25/12 22:56:31:374 IST] 00000047 SystemErr     R     at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1557)
    [2/25/12 22:56:31:374 IST] 00000047 SystemErr     R     at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:173)
    [2/25/12 22:56:31:374 IST] 00000047 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:455)
    [2/25/12 22:56:31:374 IST] 00000047 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:384)
    [2/25/12 22:56:31:374 IST] 00000047 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
    [2/25/12 22:56:31:374 IST] 00000047 SystemErr     R     at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
    [2/25/12 22:56:31:374 IST] 00000047 SystemErr     R     at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    [2/25/12 22:56:31:374 IST] 00000047 SystemErr     R     at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    [2/25/12 22:56:31:375 IST] 00000047 SystemErr     R     at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    [2/25/12 22:56:31:375 IST] 00000047 SystemErr     R     at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:202)
    [2/25/12 22:56:31:375 IST] 00000047 SystemErr     R     at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:766)
    [2/25/12 22:56:31:375 IST] 00000047 SystemErr     R     at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:896)
    [2/25/12 22:56:31:375 IST] 00000047 SystemErr     R     at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1527)

UserBean.java 中的第 41 行是:

//在UserBean.java中,包含UserBean一个无状态的EJB

    public class UserBean implements UserBeanInterface {

      /**
      * Default constructor. 
      */
@PersistenceContext
    private EntityManager manager;

public UserBean() {
}
public String authenticate(String name){
    return null;
}
public String changePassword(){
    return null;
}
public String setUserDetails(){
    return null;
}
public String getUserDetails(){
    System.out.println("hello");
    try{
41=>  Query query=manager.createQuery("from User");

        List<User> results = query.getResultList();

        if(results.size()!=0){
            Iterator<User> stIterator=results.iterator();
            while(stIterator.hasNext()){
                User st=stIterator.next();
                System.out.print("User Id:"+st.getUserId());
                System.out.print("Type:"+st.getUserType());
                System.out.print("Detail:"+st.getUserProfile());
            }
        }
        else
        {
            System.out.println("Record not found.");
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
        System.out.println("Error...:(");
    }
    return "hi";

    }
    }

User 类,User 是从数据库表中自动生成的。数据库中有一个 USER 表。请帮忙看看这个错误的可能原因是什么。

【问题讨论】:

  • 请显示整个班级(尤其是manager 属性)。
  • manager 是唯一可能为 null 的东西,您如何访问持久性管理器?
  • @nico_ekito 我已经添加了整个 UserBean 类...请帮助...
  • 我不明白 - 第 41 行是哪一行?
  • 对不起,我更新代码时误删了...

标签: java database jakarta-ee jpa nullpointerexception


【解决方案1】:

您的EntityManager manager 是注入到您的客户端UserBean 中的无接口企业Java Bean。 EJB 应该注入到生命周期由应用服务器管理的类中。

客户端必须是 Web 组件或另一个企业 bean。在您的情况下,客户端 UserBean 是 POJO(普通旧 Java 对象)。有关如何使用 EJB 的更多详细信息,请参阅 here

一个可能的简单解决方案是通过在类定义之前添加注释 javax.ejb.Stateless 使 UserBean 成为无状态会话 Bean。您最终应该使用 EJB 注释将 UserBean 注入到您的 ManagedBean 中。

【讨论】:

  • 好的...但我没有完全理解。我应该如何注入 javax.persistence.EntityManager??
  • 一个可能的简单解决方案是通过在类定义之前添加注释 javax.ejb.Stateless 使 UserBeanInterface 成为无状态会话 Bean。您最终应该使用 EJB 注释将 UserBeanInterface 注入到您的 ManagedBean 中。
  • 如何使接口成为无状态会话 Bean?
  • 我还是不明白...你能举个例子吗...?
【解决方案2】:

在这种情况下,请确保在创建包含实体管理器的类的对象之前编写@EJB 注释。 空指针异常的原因一般是因为entitymanager没有初始化。 @EJB 注释可以做到这一点。

在您的情况下,您声明用户类对象的类写 上面的@EJB。这应该可以解决问题。

【讨论】:

  • 好吧,这是一篇旧帖子。我很久以前就使用上面的答案解决了它。无论如何,感谢您的发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
相关资源
最近更新 更多