2017-01-11 7 views
0

Я получаю исключение Nullpointer для EntityManager, которое я вставляю в свой Bean. Я уже искал решения, но ничего не мог найти в сообщениях, которые помогли мне. Также я не понимаю, почему сообщение об ошибке говорит, что ошибка произошла в ExampleServlet, которой у меня нет в моем приложении.EntityManager Nullpointer Exception

Мой DAO Bean вызывается метод, который вызывается с помощью OData обработчика, который зарегистрирован в PersonServlet с:

public void initData() { 
    PersonDAO psDAO = new PersonDAO(); 
    psDAO.getAllPersons(); 
} 

Что может быть причиной ошибки в моем случае?

Ошибка:

2017-01-11T18:46:58.721+0000|Severe: [http-listener-1(5)] ERROR test.personservice.web.PersonServlet - Server Error occurred in ExampleServlet 
2017-01-11T18:46:58.722+0000|Severe: java.lang.NullPointerException 
    at test.personservice.dao.PersonDAO.getAllPersons(PersonDAO.java:21) 
    at test.personservice.data.Storage.initSampleData(Storage.java:94) 
    at test.personservice.data.Storage.<init>(Storage.java:30) 
    at test.personservice.web.PersonServlet.service(PersonServlet.java:35) 
    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) 
2017-01-11T18:46:58.723+0000|Warning: StandardWrapperValve[PersonServlet]: Servlet.service() for servlet PersonServlet threw exception 
java.lang.NullPointerException 
    at test.personservice.dao.PersonDAO.getAllPersons(PersonDAO.java:21) 
    at test.personservice.data.Storage.initSampleData(Storage.java:94) 
    at test.personservice.data.Storage.<init>(Storage.java:30) 
    at test.personservice.web.PersonServlet.service(PersonServlet.java:35) 
    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) 

Bean

@Stateless 
public class PersonDAO { 

    @PersistenceContext 
    private EntityManager em; 

    public List<Person> getAllPersons() { 

     return 
      em.createQuery("SELECT p FROM T_Person p", Person.class).getResultList(); 

    } 

} 

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="PersonService" transaction-type="JTA"> 
    <jta-data-source>jdbc/PersonDB</jta-data-source> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.hbm2ddl.auto" value="create"/> 
      <property name="hibernate.show_sql" value="yes"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>test</groupId> 
    <artifactId>PersonService</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>PersonService Maven Webapp</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
     <!-- <javax.version>3.1</javax.version> --> 
     <odata.version>4.0.0</odata.version> 
     <slf4j.version>1.7.7</slf4j.version> 
    </properties> 

    <dependencies> 

     <!-- <dependency> --> 
     <!-- <groupId>javax.servlet</groupId> --> 
     <!-- <artifactId>servlet-api</artifactId> --> 
     <!-- <version>${javax.version}</version> --> 
     <!-- <scope>provided</scope> --> 
     <!-- </dependency> --> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.ejb</groupId> 
      <artifactId>javax.ejb-api</artifactId> 
      <version>3.2</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.2.5.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>5.3.4.Final</version> 
     </dependency> 



     <dependency> 
      <groupId>org.apache.olingo</groupId> 
      <artifactId>odata-server-api</artifactId> 
      <version>${odata.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.olingo</groupId> 
      <artifactId>odata-server-core</artifactId> 
      <version>${odata.version}</version> 
      <scope>runtime</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.olingo</groupId> 
      <artifactId>odata-commons-api</artifactId> 
      <version>${odata.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.olingo</groupId> 
      <artifactId>odata-commons-core</artifactId> 
      <version>${odata.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-simple</artifactId> 
      <version>${slf4j.version}</version> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.11</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <finalName>PersonService</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

PersonServlet

public class PersonServlet extends HttpServlet { 

    private static final long serialVersionUID = 1L; 
    private static final Logger LOG = LoggerFactory.getLogger(PersonServlet.class); 

    protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { 
     try { 
     HttpSession session = req.getSession(true); 
     Storage storage = (Storage) session.getAttribute(Storage.class.getName()); 
     if (storage == null) { 
      storage = new Storage(); 
      session.setAttribute(Storage.class.getName(), storage); 
     }  
     // create odata handler and configure it with CsdlEdmProvider and Processor 
     OData odata = OData.newInstance(); 
     ServiceMetadata edm = odata.createServiceMetadata(new PersonEdmProvider(), new ArrayList<EdmxReference>()); 
     ODataHttpHandler handler = odata.createHandler(edm); 
     handler.register(new PersonEntityCollectionProcessor(storage)); 
     handler.register(new PersonEntityProcessor(storage)); 
     handler.register(new PersonPrimitiveProcessor(storage)); 

     // let the handler do the work 
     handler.process(req, resp); 
     } catch (RuntimeException e) { 
     LOG.error("Server Error occurred in ExampleServlet", e); 
     throw new ServletException(e); 
     } 
    } 
} 

Хранение:

@Stateless 
public class Storage { 

    @EJB 
    PersonDAO psDAO; 

    private List<Entity> personList; 

    public Storage() { 
     personList = new ArrayList<Entity>(); 
    } 

    @PostConstruct 
    private void initSampleData(){ 
     psDAO.getAllPersons(); 
    } 
} 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="3.1" 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <servlet> 
     <servlet-name>PersonServlet</servlet-name> 
     <servlet-class>test.personservice.web.PersonServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>PersonServlet</servlet-name> 
     <url-pattern>/PersonService.svc/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

ответ

0

Вы создаете экземпляр Storage самостоятельно, используя new, поэтому объект хранения не управляется контейнер, поэтому он не может вводить DAO в него. По переходу, поскольку DAO не является нулевым, я могу смело предположить, что объект Storage также создает DAO с использованием new, поэтому еще раз DAO не управляется контейнером, что, таким образом, не может внедрить в него диспетчер сущностей.

Используйте инъекцию зависимости. Не создавайте хранилище и DAO самостоятельно.

+0

Спасибо за ответ! Итак, все классы должны быть фасолью и управляться контейнером EJB, так как это транзитивно? Означает ли это, что Servlet должен быть bean-компонентом, где я вставляю Storage, который также является bean-компонентом, и весь обработчик, зарегистрированный в сервлете, также должен быть bean-компонентом, так как они называют класс хранения? – manban

+0

Сервлет уже является фасолью. Контейнер создает его для вас. DAO должен быть фасолью, поскольку контейнер должен вводить в него EM. Поскольку вы также хотите ввести DAO в хранилище, Хранение должно быть компонентом и быть введено в сервлет. Вы вручную вводите хранилище в PersonEntityCollectionProcessor и другие коллекционеры, поэтому им не обязательно быть beans: ничто не должно быть введено контейнером в этих объектах, и они никуда не инъецируются (AFAIK) –

+0

Итак, теперь У меня есть аннотации Stateless в хранилище и на классе PersonDAO. Я вставляю класс Storage с помощью аннотации EJB в Servlet вместо того, чтобы создавать его самостоятельно. Я также добавляю PersonDAO в класс хранения, а не создавая его вручную. Но теперь я получаю исключение Nullpointer Exception, когда я вызываю метод getAllPersons() на инъецируемый объект personDAO. Это sais: 'EJB Container initialization erro at org.glassfish.ejb.startup.EjbApplication.loadContainers' ... 'Вызывается: java.lang.NullPointerException у test.personservice.data.Storage.initSampleData' – manban