【问题标题】:Error NullPointerException Servlet [duplicate]错误 NullPointerException Servlet [重复]
【发布时间】:2016-04-03 11:01:50
【问题描述】:

制作将用户保存为数据库的程序时出现以下错误。 该程序以 index.html 开头,其中有一个按钮 qual 将其收紧,然后转到执行该方法的 addUser servlet。

错误:

    SEVERE: Servlet.service() for servlet [servlet.TestEJB] in context with path [/activitat] threw exception
java.lang.NullPointerException
    at servlet.TestEJB.doPost(TestEJB.java:40)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

小服务程序:

@WebServlet("/TestEJB")
public class TestEJB extends HttpServlet{

    private static final long serialVersionUID = 1L;

    MissatgesEJB meuEJB;

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");

        try (PrintWriter out = resp.getWriter()) {

            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet TestEJB</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Proves Whatsapp</h1>");

            Usuaris usuari = new Usuaris("robert_1994", "Paucasals33", "Bruch");
            out.println("Insertant Usuari... " + meuEJB.insertarUsuari(usuari) + "<br/>");

            out.println("</body>");
            out.println("</html>");
        }

    }

}

方法:

public class MissatgesEJB {

    @PersistenceUnit
    EntityManagerFactory emf;

    public String insertarUsuari(Usuaris u) {

        EntityManager em = emf.createEntityManager();

        try {
            // Excriu a la BD.
            em.persist(u);

            // Forçem a que escrigui ara ala BD.
            em.flush();

            return "ok";

        } catch (Exception ex) {

            return ex.getMessage();

        } finally {

            em.close();
        }


    }

}

Persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="JPA-1" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>beans.Historial</class>
        <class>beans.Missatges</class>
        <class>beans.Usuaris</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/bdwhatsapp" />
            <property name="javax.persistence.jdbc.user" value="marti" />
            <property name="javax.persistence.jdbc.password" value="Paucasals33" />
            <property name="javax.persistence.schema-generation.database.action"
                value="none" />
        </properties>
    </persistence-unit>
</persistence>

【问题讨论】:

  • 所以有些东西是空的,那是什么?

标签: java jpa servlets


【解决方案1】:

在您的 servlet 中,您需要以某种方式初始化或注入 meuEJB。由于您没有对其进行初始化,因此在执行以下行时会收到 NullPointerException

out.println("Insertant Usuari... " + meuEJB.insertarUsuari(usuari) + "<br/>");

【讨论】:

    【解决方案2】:

    MissatgesEJB 类型的对象 meuEJB 未初始化,您正在尝试在线调用 insertarUsuari

    out.println("Insertant Usuari... " + meuEJB.insertarUsuari(usuari) + "<br/>");
    

    你可能想使用@Inject这样的注解来初始化meuEJB

    @Inject
    MissatgesEJB meuEJB;
    

    【讨论】:

    • 我在eclipse中找到inject注解需要一些jar吗?
    • 这是一个单独的 jar,您必须包含在内。如果您使用的是具有集成依赖管理(Maven、Gradle、Ant+Ivy、sbt)的构建系统,您可以通过将其添加到依赖列表来免费获得它。如果您仍在复制罐子,那么您必须手动添加它。您可以从Maven central(底部)下载最新的jar。
    猜你喜欢
    • 2019-01-05
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多