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.