Dependency Injection Not Working in a Rest Resource
nwallman Apr 18, 2012 9:54 AMI 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.