2017-04-17 1 views
0

D'où provient le NullPointerException indiqué dans le journal Glassfish? Le ConverterServlet semble avoir dollar comme numéro BigInteger, non nul. Si ConverterBean enregistrer simplement le montant en dollars qui serait au moins un pas dans la bonne direction. L'EJB n'est-il pas injecté correctement, peut-être?NullPointerException d'EJB injecté dans le servlet

Le montant en dollars codé en dur est sortie correctement:

quel est le montant? Servlet ConverterServlet à /montant ConverterApplication-guerre est 999

dollars: 999 classe java.math.BigDecimal

mais ne sont jamais exécutées yen et l'euro en raison de la NPE rapporté dans Glassfish:

[2017-04-17T00:12:27.609-0700] [glassfish 4.1] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=84 _ThreadName=http-listener-1(1)] [timeMillis: 1492413147609] [levelValue: 900] [[ 
    StandardWrapperValve[ConverterServlet]: Servlet.service() for servlet ConverterServlet threw exception 
java.lang.NullPointerException 
    at net.bounceme.dur.ejb.ConverterServlet.processRequest(ConverterServlet.java:41) 
    at net.bounceme.dur.ejb.ConverterServlet.doGet(ConverterServlet.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
    at java.lang.Thread.run(Thread.java:745) 
]] 

servlet:

package net.bounceme.dur.ejb; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.math.BigDecimal; 
import javax.ejb.EJB; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet(urlPatterns = "/") 
public class ConverterServlet extends HttpServlet { 

    @EJB 
    ConverterBean converter; 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     try (PrintWriter out = response.getWriter()) { 
      /* TODO output your page here. You may use following sample code. */ 
      out.println("<!DOCTYPE html>"); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet ConverterServlet</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 

      out.println("what is the amount?"); 
      out.println("<h1>Servlet ConverterServlet at " + request.getContextPath() + "</h1>"); 

      String stringAmount = "999"; 
      out.println("amount is " + stringAmount); 
      out.println("<p>"); 
      BigDecimal dollars = new BigDecimal(stringAmount); 
      out.println("dollars:\t" + dollars + "\t" + dollars.getClass()); 
      out.println("<p>"); 

      BigDecimal yen = converter.dollarToYen(dollars); 
      BigDecimal euros = converter.yenToEuro(yen); 

      out.println("never executed.."); 
      out.println("yen"); 
      out.println(yen); 
      out.println("<p>"); 
      out.println("euros"); 
      out.println(euros); 
      out.println("<p>"); 

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

     } 
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
    /** 
    * Handles the HTTP <code>GET</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    /** 
    * Handles the HTTP <code>POST</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    /** 
    * Returns a short description of the servlet. 
    * 
    * @return a String containing servlet description 
    */ 
    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    }// </editor-fold> 

} 

et EJB:

package net.bounceme.dur.ejb; 

import java.math.BigDecimal; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import java.util.Properties; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.ejb.Stateless; 

@Stateless 
public class ConverterBean { 

    private static final Logger log = Logger.getLogger(ConverterBean.class.getName()); 
    private static final Level LEVEL = Level.INFO; 
    private static final BigDecimal YEN_RATE = new BigDecimal("83.0602"); 
    private static final BigDecimal EURO_RATE = new BigDecimal("0.0093016"); 

    public BigDecimal dollarToYen(BigDecimal dollars) { 
     return YEN_RATE; 
    } 
    public BigDecimal yenToEuro(BigDecimal yen) { 
     return EURO_RATE; 
    } 

    public BigDecimal realdollarToYen(BigDecimal dollars) { 
     log.info("dollarToYen.." + dollars); 
     BigDecimal result = dollars.multiply(YEN_RATE); 
     return result.setScale(2, BigDecimal.ROUND_UP); 
    } 

    public BigDecimal realyenToEuro(BigDecimal yen) { 
     log.info("yenToEuro.." + yen); 
     BigDecimal result = yen.multiply(EURO_RATE); 
     return result.setScale(2, BigDecimal.ROUND_UP); 
    } 

    private void lookup() throws NamingException { 
     System.out.println("fuck"); 
     PropertiesReader pr = new PropertiesReader(); 
     Properties webService = pr.getProps("WebService"); 
     log.info(pr.toString()); 
     log.info(new InitialContext().getEnvironment().toString()); 
    } 

} 

vue arborescente de l'application:

ConverterApplication/ 
├── build.xml 
├── ConverterApplication-ejb 
│   ├── build.xml 
│   ├── nbproject 
│   │   ├── ant-deploy.xml 
│   │   ├── build-impl.xml 
│   │   ├── genfiles.properties 
│   │   ├── private 
│   │   │   ├── private.properties 
│   │   │   └── private.xml 
│   │   ├── project.properties 
│   │   └── project.xml 
│   └── src 
│    ├── conf 
│    │   └── MANIFEST.MF 
│    └── java 
│     ├── net 
│     │   └── bounceme 
│     │    └── dur 
│     │     └── ejb 
│     │      ├── Client.java 
│     │      ├── ConverterBean.java 
│     │      └── PropertiesReader.java 
│     └── resources 
│      ├── JNDI.properties 
│      └── WebService.properties 
├── ConverterApplication-war 
│   ├── build.xml 
│   ├── nbproject 
│   │   ├── ant-deploy.xml 
│   │   ├── build-impl.xml 
│   │   ├── genfiles.properties 
│   │   ├── private 
│   │   │   ├── private.properties 
│   │   │   └── private.xml 
│   │   ├── project.properties 
│   │   └── project.xml 
│   ├── src 
│   │   ├── conf 
│   │   │   └── MANIFEST.MF 
│   │   └── java 
│   │    └── net 
│   │     └── bounceme 
│   │      └── dur 
│   │       └── ejb 
│   │        ├── ConverterServlet.java 
│   │        └── PropertiesReader.java 
│   ├── test 
│   └── web 
│    ├── index.html 
│    └── WEB-INF 
│     └── web.xml 
├── nbproject 
│   ├── ant-deploy.xml 
│   ├── build-impl.xml 
│   ├── genfiles.properties 
│   ├── private 
│   │   └── private.properties 
│   ├── project.properties 
│   └── project.xml 
└── src 
    └── conf 
     └── MANIFEST.MF 

28 directories, 35 files 

de:

https://docs.oracle.com/javaee/7/tutorial/ejb-gettingstarted001.htm

Répondre

1

Ajouter des fichiers beans.xml vides dans classpaths de votre ConverterApplication-guerre et ConverterApplication-ejb modules (dans WEB-INF et les dossiers META-INF). Ils ont besoin de découvrir les composants injectés.

+0

cela fonctionne. Mais ... il conduit à cette "erreur" Netbeans: http://stackoverflow.com/q/12168353/262852 et, je pensais que beans.xml était obsolète ... cela nécessite des recherches supplémentaires. Je n'ai aucun problème à accepter cela comme réponse, mais l'élaboration serait appréciée. – Thufir

+0

@Thufir s'il vous plaît montrer votre arborescence mise à jour de l'application. – Rinat

+0

application mise à jour ici: http://stackoverflow.com/q/43488182/262852 mais c'est juste une guerre avec une interface locale pour EJB et non un EAR. – Thufir

0
solution

:

package net.bounceme.dur.ejb; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.math.BigDecimal; 
import javax.ejb.EJB; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet(urlPatterns = "/") 
public class ConverterServlet extends HttpServlet { 

    @EJB 
    ConverterBean converter; 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     converter = new ConverterBean(); 
     try (PrintWriter out = response.getWriter()) { 
      /* TODO output your page here. You may use following sample code. */ 
      out.println("<!DOCTYPE html>"); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet ConverterServlet</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 

      out.println("what is the amount?"); 
      out.println("<h1>Servlet ConverterServlet at " + request.getContextPath() + "</h1>"); 

      String stringAmount = "999"; 
      out.println("amount is " + stringAmount); 
      out.println("<p>"); 
      BigDecimal dollars = new BigDecimal(stringAmount); 
      out.println("dollars:\t" + dollars + "\t" + dollars.getClass()); 
      out.println("<p>"); 

      BigDecimal yen = converter.dollarToYen(dollars); 
      BigDecimal euros = converter.yenToEuro(yen); 

      out.println("never executed.."); 
      out.println("yen"); 
      out.println(yen); 
      out.println("<p>"); 
      out.println("euros"); 
      out.println(euros); 
      out.println("<p>"); 

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

     } 
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
    /** 
    * Handles the HTTP <code>GET</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    /** 
    * Handles the HTTP <code>POST</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    /** 
    * Returns a short description of the servlet. 
    * 
    * @return a String containing servlet description 
    */ 
    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    }// </editor-fold> 

} 

cependant, instancier la fève ne devrait pas être nécessaire . Correct ou faux?

voir:

NullPointerException in ejb injection

+4

Ce n'est pas la bonne réponse. Vous obtenez un NPE car vous semblez déployer des modules EJB distincts et des modules WAR. Les classes de fichier WAR ne pourront pas voir les classes EJB. Dans l'ancien temps, vous emballer les deux dans un fichier EAR. Mais avec Java EE 6 et plus récent, vous pouvez simplement mettre toutes les classes dans votre fichier WAR - ou inclure le fichier jar EJB dans votre répertoire WEB-INF/lib –

+0

Je ne suis pas tout à fait. Oui, mon envie était de séparer l'EJB de WAR. Je les ai seulement brouillés ensemble pour qu'il soit plus facile de les déployer comme un EAR. Si vous pouviez élaborer, ce serait apprécié. – Thufir

+0

Java EE impose des règles pour la visibilité de la classe entre les modules et les déploiements. En général, les déploiements distincts ne peuvent pas voir les classes de l'autre. –