【问题标题】:Access EJB in JSP gives null pointerJSP中的Access EJB给出空指针
【发布时间】:2014-04-03 16:27:56
【问题描述】:

我正在尝试从我的 JSP 中的数据库中获取一个用户实体,我在其中迭代消息实体。

每条消息都包含其作者 ID。

这是我的 servlet 代码

public class messageServlet extends HttpServlet {

    @EJB
    private MessageDAO messageDAO;
    @EJB
    private UserDAO userDAO;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse response)
            throws ServletException, IOException {
        Long clean_id = Long.valueOf(req.getParameter("id"));
        UserEntity user = (UserEntity) req.getSession().getAttribute("me");

        if (user == null) {
            response.sendRedirect("login.jsp");
        } else {
            if (clean_id != null) {
                List<MessageEntity> messages = messageDAO.findByTopic(clean_id);
                if (messages != null) {
                    req.setAttribute("messages", messages);
                    req.setAttribute("userDAO", new JpaUserDAO());
                    req.getRequestDispatcher("/message.jsp").forward(req, response);
                }
            } else {
                req.getRequestDispatcher("/message.jsp").forward(req, response);
            }
        }

    }

还有我的 message.jsp

<%@page import="javax.naming.InitialContext"%>
<%@page import="com.forum.entity.UserEntity"%>
<%@page import="com.forum.dao.jpa.JpaUserDAO"%>
<%@page import="com.forum.entity.MessageEntity"%>
<%@page import="com.forum.dao.UserDAO"%>
<%@page import="javax.ejb.EJB"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Category page</title>
        <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
    </head>
    <body>
        <%@ include file="navbar.jsp" %>

        <h1>Messages</h1>
        <ul>
            <c:choose>
                <c:when test="${not empty user}">

                    <li>

                        <c:forEach items="${messages}" var="message">
                            <c:out value="${message.getMessage_author_id()}"></c:out>
                            <c:set var="user" value="${userDAO.find(message.getMessage_author_id())}"></c:set>

                              <c:out value="${user.getUser_email()}"></c:out>
                            <c:out value="${message.getMessage_author_id()}"/><br />
                            <c:out value="${message.getMessage_created()}"/><br />
                            <c:out value="${message.getMessage_content()}"/><br />
                            <c:if test="${user_role == 'mod' || user_role == 'admin'}">
                                <a href="editmessage?id=${message.getMessage_id()}">Edit</a>
                                <a href="deletemessage?id=${message.getMessage_id()}">Delete</a>
                            </c:if>
                            <br /><br />
                        </c:forEach>
                    </c:when>
                    <c:otherwise>
                        <c:url value="/doLogin" var="loginUrl" />
                        <a href="${loginUrl}">${message.getMessage_content()}</a>
                    </c:otherwise>

                </c:choose>
            </li>

        </ul>
    </body>
</html>

servlet 中调用的 JpaUsersDAO:

package com.forum.dao.jpa;

import com.forum.dao.UserDAO;
import com.forum.entity.UserEntity;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author me
 */
@Stateless
public class JpaUserDAO implements UserDAO {

    @PersistenceContext
    private EntityManager em;



    @Override
    public UserEntity find(Long id) {
        return em.find(UserEntity.class, id);
    }
}

当我在 JSP 中迭代时,对于每条消息,我想使用 JpaUserDAO.find() 获取与消息的作者 ID 对应的用户,以便能够显示作者的信息。 当我尝试这样做时,我在 find() 函数中得到一个 NULL 指针异常,并且无法真正弄清楚如何解决我的问题。

有没有办法让我轻松地做我想做的事?

【问题讨论】:

  • EntityManager 没有被注入,因为它没有被创建。看起来您的 persistence.xml 文件有问题。
  • 它在其他任何地方都可以使用,我只在我的所有课程中使用 Entitymanagers 注入,它可以在除那里之外的任何地方使用。

标签: java jsp jakarta-ee servlets


【解决方案1】:

为什么要创建JpaUserDAO 的新实例? 这看起来像你的问题的原因。 messageServlet 中的以下行没有意义;

req.setAttribute("userDAO", new JpaUserDAO());

您已将 JpaUserDAO 声明为 EJB。

@Stateless
public class JpaUserDAO implements UserDAO {

因此,当您使用@Inject@EJB 时,将为您创建实例并注入到适当的位置。

为什么不单独处理Servlet中的userDAO.find(message.getMessage_author_id())行呢?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多