2 Replies Latest reply: Apr 19, 2012 4:59 PM by Nathan Wallman RSS

Dependency Injection Not Working in a Rest Resource

Nathan Wallman Newbie

I have a couple of JUnit tests working with Dependency Injection already but for whatever reason I can't get this particular test to work.  The one thing that I see is different in this case is the Dependency Injection of the EJB is not happening inside of the unit test itself.  Instead the unit test is calling a Jersey Resource that is deployed along with the War.  My Jersey Resource has an EJB I'm trying to inject which isn't working.  Here is my code:

 

 

@RunWith(Arquillian.class)
public class SiteSettingsResourceTest {


          private static Integer TEST_SITE_ID = 1;


          @Deployment
          public static Archive<?> createDeployment() {
                    return ShrinkWrap
                                        .create(WebArchive.class, "hapi-web.war")
                                        .addClasses(SiteManager.class, SiteManagerLocal.class, SiteDAO.class, SiteDAOLocal.class, SiteHibernateImpl.class, SiteJDBCImpl.class, AbstractResource.class,
                                                            SiteSettingsResource.class).addAsResource("embedded/test-persistence.xml", "META-INF/persistence.xml")
                                        .addAsResource("embedded/test-queries.hbm.xml", "META-INF/test-queries.hbm.xml").addAsWebResource("embedded/test-web.xml", "WEB-INF/web.xml")
                                        .addAsWebResource(EmptyAsset.INSTANCE, "beans.xml");
          }

          @Test
          public void testGetSettingsHibernate() {
                    Client client = Client.create();
                    WebResource webResource = client.resource("http://0.0.0.0:8181/hapi-web/sitesettings/hibernate/" + TEST_SITE_ID);
                    ClientResponse response = webResource.accept("application/json").get(ClientResponse.class);


                    if (response.getStatus() != 200) {
                              System.out.println(response.getHeaders());
                              System.out.println(response.toString());
                              Assert.assertTrue(false);
                    } else {
                              Assert.assertTrue(true);
                    }
          }
}

 

Then my JerseyResource looks like:

 

 

 

@Path("/sitesettings")
public class SiteSettingsResource extends AbstractResource {


          private final Logger log = LoggerFactory.getLogger(this.getClass().getName());


          @EJB(mappedName = "java:global/hapi-web/SiteManager!com.noob.hapi.domain.mgr.SiteManagerLocal")
          private SiteManagerLocal siteManager;


          @GET
          @Path("/hibernate/{siteid: [0-9]}")
          @Produces({ MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
          public String getAllSettingsHibernate(@PathParam("siteid") int siteID) {
                    try {
                              SiteSettings settings = siteManager.getSiteSettingsHibernate(siteID);
                              return this.convertToJSON(settings);
                    } catch (SQLException | ConversionException e) {
                              log.error("Error getting all settings for siteID: " + siteID);
                              throw new InternalException(e.getMessage());
                    }
          }

 

 

I've tried various things but everytime I see my siteManager EJB is null.  I am assuming for whatever reason the Jersey resources are not being enriched for some reason.  I know my mappedName is correct because I pulled it right from the logs(INFO: EJB5181:Portable JNDI names for EJB SiteManager).  How can I ensure my Jersey Resources get enriched?  Thanks in advance.