Why EJB is null? [duplicate]
Asked Answered
C

1

6

I'm working on rest service and learning EJB at the same time. I just run my application with simple chain controller -> service -> DAO and my EJB hotelService is not injected -- it is null.

@Path("/hotels")
public class HotelsController {

@EJB
private HotelService hotelService;


@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getHotelsList(@QueryParam("startDate") String startDate,
                              @QueryParam("endDate") String endDate) {
    List<HotelsEntity> list = hotelService.getAll();
    return ResponseFactory.response(Response.Status.OK, list);
}
}

Service

@Stateless
@EJB(beanInterface = HotelService.class, name = "HotelService")
public class HotelService {

@EJB
private HotelDAO hotelDAO;

public List<HotelsEntity> getAll() {
    return hotelDAO.getAll();
}

public Hotel getHotelById(final String id) {
    return hotelDAO.getHotelById(id);
}
}

DAO

@Stateless
public class HotelDAO {

@PersistenceContext(unitName = Constants.PERSISTENCE_UNIT)
private EntityManager em;

public List<HotelsEntity> getAll() {
    // TODO complete me
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<HotelsEntity> criteria = builder.createQuery(HotelsEntity.class);
    Root<HotelsEntity> root = criteria.from(HotelsEntity.class);
    criteria.select(root);
    TypedQuery<HotelsEntity> resultQuery = em.createQuery(criteria);
    return resultQuery.getResultList();
}

I thought that issue may be in some eror during instatiation of HotelDAO but even without it mt HotelService is null.

Do you a have any opinion where is an issue can be?

I use glassfish 4.0 My pom is:

  <modelVersion>4.0.0</modelVersion>
<groupId>HospitalityRestServer</groupId>
<artifactId>HospitalityRestServer</artifactId>
<packaging>war</packaging>

<version>1.0-SNAPSHOT</version>
<name>HospitalityRestServer Maven Webapp</name>
<url>http://maven.apache.org</url>

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.5.Final</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>annotations-api</artifactId>
        <version>6.0.29</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.ejb</artifactId>
        <version>3.1</version>
    </dependency>
</dependencies>

Log:

[2014-04-28T17:58:05.828+0400] [glassfish 4.0] [WARNING] [] [javax.enterprise.web] 
tid: _ThreadID=22 _ThreadName=http-listener-1(4)] [timeMillis: 1398693485828] [levelValue: 900] [[

StandardWrapperValve[javax.ws.rs.core.Application]: Servlet.service() for servlet javax.ws.rs.core.Application threw exception java.lang.NullPointerException at com.example.controller.HotelsController.getHotelsList(HotelsController.java:29) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:125) at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:91) at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:346) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:341) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101) at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:224) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:267) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198) at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946) at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:323) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218) 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:357) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188) at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) at java.lang.Thread.run(Thread.java:745) ]]

Clippers answered 28/4, 2014 at 13:11 Comment(0)
T
5

You need to either implement a @Local annotated interface that expresses the local view of that EJB bean, or you need to add the @LocalBean annotation to the HotelService class itself to explicitly state that it is a local no-interface view of that EJB.

@Stateless
@EJB(beanInterface = HotelService.class, name = "HotelService")
@LocalBean
public class HotelService {
    // ...
}

If you want the service to be available outside of the container for RMI or EJB client execution, you'll need to create a @Local and @Remote view of that service and implement both.

Thomasinethomason answered 28/4, 2014 at 13:13 Comment(14)
Thanks for your answer, but it doesn't help -- I marked it as LocalBean but issue is the sameClippers
After doing a little reading on the java ee 7 docs, I realized that the @LocalBean is not actually required. Are you getting any other errors on startup? Have you checked the server logs?Thomasinethomason
Yes, on startup I had an issue described here java.net/jira/browse/GLASSFISH-20579 and I resolved it by setting asadmin set configs.config.server-config.cdi-service.enable-implicit-cdi=false That is all, log doesn't have anything elseClippers
That may come back to bite you if you ever choose to use CDI in your application. But regardless, it sounds like you need to raise the log levels for your application. Also... can I see the NPE being thrown when you attempt to call your web service?Thomasinethomason
Wait a minute... I just noticed you're also injecting the DAO into your Service class. Can I see the annotations you have on that object?Thomasinethomason
Update with log. An a few minutes update and DAO but I also had tried without DAO -- issue is the sameClippers
Update DAO. Too shortClippers
The only other thing I can think of is that EJBs have to be injected into managed objects and apparently your service doesn't qualify. Try making your service a @Stateless bean, rebuild and try again. If that is the case, and you don't wish to add the overhead of another bean, try using CDI instead. :-)Thomasinethomason
Well, my service is already a stateless bean :)Clippers
I'm not talking about the HotelService object. I'm talking about the HotelController object which exposes a JAX-RS web service.Thomasinethomason
Let me know if this works and I'll update my answer.Thomasinethomason
I resolved it - I have added a bean.xml. I'm appreciate all your help jgitter. Thank you!Clippers
I mark it as answer because at least it ha an answer in commentsClippers
Congrats and cheers to you!Thomasinethomason

© 2022 - 2024 — McMap. All rights reserved.