dev@glassfish.java.net

Re: _at_PersistenceUnit injection seems not working (emf is still null after injection) in my web-tier controller

From: Max Poon <maxpoon_at_dev.java.net>
Date: Tue, 24 Apr 2007 12:20:56 +0800

Hi Sahoo

Thanks to the pointer to Table J2EE.5-1: Component classes supporting
injection. However, I read also in JavaEE 5 spec (just above the table)
that

    * "Typically injection will occur after an instance of the class is
      constructed, but before any business methods are called. If the
      container fails to find a resource needed for injection,
      initialization of the class must fail, and the class must not be
      put into service."

In my testing, I observed that simpleHibernateAppAgent.java was
initialized and put into operation. Just that the @PersistenceUnit was
ignored without any warning/error until the emf is put into use which
then caused NPE. Strictly speaking, GlassFish did not "fail to find a
resource needed for injection", but it just ignored the "request for
injection" without warning/error. Do we think there should be a RFE so
that warning/error are issued in such case?

Thanks
Max


Sanjeeb Kumar Sahoo wrote:
> Hi Max,
>
> Resource Injection is not supported in an MBean. Refer to "Table
> J2EE.5-1: Component classes supporting injection" in Java EE 5
> platform spec for further details.
>
> Thanks,
> Sahoo
> Max Poon wrote:
>> Hi
>>
>> I was configuring statistics collection via Hibernate JMX for an
>> JPA-Hibernate application created
>> http://wiki.netbeans.org/wiki/view/UsingHibernateWithJPA. I created
>> the following :
>>
>> * simpleHibernateAppAgent.java
>> o web-tier JMX Agent with @PersistenceUnit resource
>> injection which unfortunately was not successful (the
>> injected EntityManagerFactory emf was found to be null as
>> indicated in debug results in server.log).
>> simpleHibernateAppAgent is very similar to other web-tier
>> controller codes with successful @PersistenceUnit injection.
>> * ManufacturerController.java
>> o web-tier controller codes with successful @PersistenceUnit
>> injection, shown by successful execution of Entity queries
>> and also debug statements showing emf != null.
>> * persistence.xml
>> o included as reference.
>>
>> [Note: When I modified simpleHibernateAppAgent.getDefault( ) and
>> init( ) to getDefault(emf) and init(emf) and to pass emf as a
>> parameter from ManufacturerController to
>> simpleHibernateAppAgent.getDefault(emf), everything seem to work
>> fine. Just seems that @PersistenceUnit injection in
>> simpleHibernateAppAgent is not working.]
>>
>> *Question:* Both simpleHibernateappAgent and ManufacturerController
>> are using same @PersistenceUnit to inject the EntityManagerFactory
>> but why is injection failed in 1st case while succeeded in 2nd case?
>>
>> Appreciate any advice.
>>
>> Thanks
>> Max
>> ------------------------------------------------------------------------
>>
>> /*
>> * simpleHibernateAppAgent.java
>> *
>> */
>>
>> package simpleHibernateApp.agents;
>>
>> import java.lang.management.ManagementFactory;
>> import javax.annotation.Resource;
>> import javax.management.MBeanServer;
>> import javax.management.ObjectName;
>> import javax.persistence.EntityManagerFactory;
>> import javax.persistence.EntityManager;
>> import javax.persistence.Persistence;
>> import javax.persistence.PersistenceUnit;
>> import javax.transaction.UserTransaction;
>> import net.sf.ehcache.CacheManager;
>> import net.sf.ehcache.management.ManagementService;
>> import org.hibernate.Session;
>> import org.hibernate.SessionFactory;
>> import org.hibernate.jmx.StatisticsService;
>>
>> /**
>> * JMX agent class.
>> * You may use the New JMX MBean wizard to create a Managed Bean.
>> * @author Max.Poon_at_Sun.COM
>> */
>> public class simpleHibernateAppAgent {
>> @PersistenceUnit(unitName = "SimpleHibernateAppPU")
>> EntityManagerFactory emf;
>>
>> private EntityManager em = null;
>> private Session session = null;
>> private SessionFactory sf = null;
>> /**
>> * Instantiate and register your MBeans.
>> */
>> public void init() throws Exception {
>> try {
>> if (emf == null) System.out.println("****** emf null");
>> em = emf.createEntityManager();
>> if (em == null) System.out.println("****** em null");
>> session = (Session) em.getDelegate();
>> if (session == null) System.out.println("****** session
>> null");
>> sf = session.getSessionFactory();
>> if (sf == null) System.out.println("****** sf null");
>> } catch (Exception ex) {
>> System.out.println(ex);
>> } finally {
>> em.close();
>> }
>>
>> MBeanServer mBeanServer =
>> ManagementFactory.getPlatformMBeanServer();
>> ObjectName on = new
>> ObjectName("Hibernate:type=statistics,application=SimpleHibernateApp");
>>
>> StatisticsService statsMBean = new StatisticsService();
>> statsMBean.setStatisticsEnabled(true);
>> statsMBean.setSessionFactory(sf);
>> mBeanServer.registerMBean(statsMBean, on);
>> CacheManager cacheMgr = new CacheManager();
>> ManagementService.registerMBeans(cacheMgr, mBeanServer, true,
>> true, true, true);
>> }
>> /**
>> * Returns an agent singleton.
>> */
>> public synchronized static simpleHibernateAppAgent getDefault()
>> throws Exception {
>> if(singleton == null) {
>> singleton = new simpleHibernateAppAgent();
>> singleton.init();
>> }
>> return singleton;
>> }
>> public MBeanServer getMBeanServer() {
>> return mbs;
>> }
>> // Platform MBeanServer used to register your MBeans
>> private final MBeanServer mbs =
>> ManagementFactory.getPlatformMBeanServer();
>> // Singleton instance
>> private static simpleHibernateAppAgent singleton;
>> }
>>
>> ------------------------------------------------------------------------
>>
>> /*
>> * ManufacturerController.java
>> *
>> */
>>
>> package simpleHibernateApp.controller;
>>
>> import java.util.ArrayList;
>> import java.util.Collection;
>> import javax.annotation.Resource;
>> import javax.faces.application.FacesMessage;
>> import javax.faces.context.FacesContext;
>> import javax.faces.model.DataModel;
>> import javax.faces.model.ListDataModel;
>> import javax.persistence.EntityManager;
>> import javax.persistence.EntityManagerFactory;
>> import javax.persistence.PersistenceUnit;
>> import javax.persistence.Query;
>> import javax.transaction.UserTransaction;
>> import simpleHibernateApp.agents.simpleHibernateAppAgent;
>> import simpleHibernateApp.entities.Manufacturer;
>>
>>
>> /**
>> *
>> * @author Max.Poon_at_Sun.COM
>> */
>> public class ManufacturerController {
>> /** Creates a new instance of ManufacturerController */
>> public ManufacturerController() { }
>>
>> private Manufacturer manufacturer;
>>
>> private DataModel model;
>>
>> @Resource
>> private UserTransaction utx;
>>
>> @PersistenceUnit(unitName = "SimpleHibernateAppPU")
>> private EntityManagerFactory emf;
>>
>> private EntityManager getEntityManager() {
>> initJMX();
>> return emf.createEntityManager();
>> }
>>
>> // Initiate JMX Agent if needed
>> void initJMX() {
>> try {
>> simpleHibernateAppAgent.getDefault();
>> } catch (Exception ex) {
>> ex.printStackTrace();
>> }
>> }
>>
>> private int batchSize = 20;
>>
>> private int firstItem = 0;
>>
>> public Manufacturer getManufacturer() {
>> return manufacturer;
>> }
>>
>> public void setManufacturer(Manufacturer manufacturer) {
>> this.manufacturer = manufacturer;
>> }
>>
>> public DataModel getDetailManufacturers() {
>> return model;
>> }
>>
>> public void setDetailManufacturers(Collection<Manufacturer> m) {
>> model = new ListDataModel(new ArrayList(m));
>> }
>>
>> public String createSetup() {
>> this.manufacturer = new Manufacturer();
>> return "manufacturer_create";
>> }
>>
>> public String create() {
>> EntityManager em = null;
>> try {
>> utx.begin();
>> em = getEntityManager();
>> em.persist(manufacturer);
>> utx.commit();
>> addSuccessMessage("Manufacturer was successfully created.");
>> } catch (Exception ex) {
>> try {
>> addErrorMessage(ex.getLocalizedMessage());
>> utx.rollback();
>> } catch (Exception e) {
>> addErrorMessage(e.getLocalizedMessage());
>> }
>> } finally {
>> em.close();
>> }
>> return "manufacturer_list";
>> }
>>
>> public String detailSetup() {
>> setManufacturerFromRequestParam();
>> return "manufacturer_detail";
>> }
>>
>> public String editSetup() {
>> setManufacturerFromRequestParam();
>> return "manufacturer_edit";
>> }
>>
>> public String edit() {
>> EntityManager em = null;
>> try {
>> utx.begin();
>> em = getEntityManager();
>> manufacturer = em.merge(manufacturer);
>> utx.commit();
>> addSuccessMessage("Manufacturer was successfully updated.");
>> } catch (Exception ex) {
>> try {
>> addErrorMessage(ex.getLocalizedMessage());
>> utx.rollback();
>> } catch (Exception e) {
>> addErrorMessage(e.getLocalizedMessage());
>> }
>> } finally {
>> em.close();
>> }
>> return "manufacturer_list";
>> }
>>
>> public String destroy() {
>> EntityManager em = null;
>> try {
>> utx.begin();
>> Manufacturer manufacturer =
>> getManufacturerFromRequestParam();
>> em = getEntityManager();
>> manufacturer = em.merge(manufacturer);
>> em.remove(manufacturer);
>> utx.commit();
>> addSuccessMessage("Manufacturer was successfully deleted.");
>> } catch (Exception ex) {
>> try {
>> addErrorMessage(ex.getLocalizedMessage());
>> utx.rollback();
>> } catch (Exception e) {
>> addErrorMessage(e.getLocalizedMessage());
>> }
>> } finally {
>> em.close();
>> }
>> return "manufacturer_list";
>> }
>>
>> public Manufacturer getManufacturerFromRequestParam() {
>> EntityManager em = getEntityManager();
>> try{
>> Manufacturer o = (Manufacturer) model.getRowData();
>> o = em.merge(o);
>> return o;
>> } finally {
>> em.close();
>> }
>> }
>>
>> public void setManufacturerFromRequestParam() {
>> Manufacturer manufacturer = getManufacturerFromRequestParam();
>> setManufacturer(manufacturer);
>> }
>>
>> public DataModel getManufacturers() {
>> EntityManager em = getEntityManager();
>> try{
>> Query q = em.createQuery("select object(o) from
>> Manufacturer as o");
>> q.setMaxResults(batchSize);
>> q.setFirstResult(firstItem);
>> model = new ListDataModel(q.getResultList());
>> return model;
>> } finally {
>> em.close();
>> }
>> }
>>
>> public static void addErrorMessage(String msg) {
>> FacesMessage facesMsg = new
>> FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
>> FacesContext fc = FacesContext.getCurrentInstance();
>> fc.addMessage(null, facesMsg);
>> }
>>
>> public static void addSuccessMessage(String msg) {
>> FacesMessage facesMsg = new
>> FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
>> FacesContext fc = FacesContext.getCurrentInstance();
>> fc.addMessage("successInfo", facesMsg);
>> }
>>
>> public Manufacturer findManufacturer(Integer id) {
>> EntityManager em = getEntityManager();
>> try{
>> Manufacturer o = (Manufacturer)
>> em.find(Manufacturer.class, id);
>> return o;
>> } finally {
>> em.close();
>> }
>> }
>>
>> public int getItemCount() {
>> EntityManager em = getEntityManager();
>> try{
>> int count = ((Long) em.createQuery("select count(o) from
>> Manufacturer as o").getSingleResult()).intValue();
>> return count;
>> } finally {
>> em.close();
>> }
>> }
>>
>> public int getFirstItem() {
>> return firstItem;
>> }
>>
>> public int getLastItem() {
>> int size = getItemCount();
>> return firstItem + batchSize > size ? size : firstItem +
>> batchSize;
>> }
>>
>> public int getBatchSize() {
>> return batchSize;
>> }
>>
>> public String next() {
>> if (firstItem + batchSize < getItemCount()) {
>> firstItem += batchSize;
>> }
>> return "manufacturer_list";
>> }
>>
>> public String prev() {
>> firstItem -= batchSize;
>> if (firstItem < 0) {
>> firstItem = 0;
>> }
>> return "manufacturer_list";
>> }
>> }
>>
>> ------------------------------------------------------------------------
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <persistence version="1.0"
>> xmlns="http://java.sun.com/xml/ns/persistence"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
>> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
>> <persistence-unit name="SimpleHibernateAppPU" transaction-type="JTA">
>> <provider>org.hibernate.ejb.HibernatePersistence</provider>
>> <jta-data-source>jdbc/sample</jta-data-source>
>> <class>simpleHibernateApp.entities.Manufacturer</class>
>> <class>simpleHibernateApp.entities.Product</class>
>> <class>simpleHibernateApp.entities.ProductCode</class>
>> <properties>
>> <property name="hibernate.dialect"
>> value="org.hibernate.dialect.DerbyDialect" />
>> <property name="hibernate.generate_statistics" value="true" />
>> <!-- cache configuration -->
>> <property name="hibernate.cache.provider_class"
>> value="net.sf.ehcache.hibernate.SingletonEhCacheProvider" />
>> <property name="hibernate.cache.provider_configuration"
>> value="/ehcache.cfg.xml" />
>> <property name="hibernate.cache.use_query_cache" value="true" />
>> <property name="hibernate.cache.use_second_level_cache"
>> value="true" />
>> <property
>> name="hibernate.ejb.classcache.simpleHibernateApp.entities.Manufacturer"
>> value="read-only"/>
>> <property
>> name="hibernate.ejb.classcache.simpleHibernateApp.entities.Product"
>> value="read-only"/>
>> <property
>> name="hibernate.ejb.classcache.simpleHibernateApp.entities.ProductCode"
>> value="read-only"/>
>> <!-- <property
>> name="hibernate.ejb.collectioncache.simpleHibernateApp.entities.Manufacturer.products"
>> value="read-only"/> -->
>> <!-- <property name="hibernate.ejb.cfgfile"
>> value="/org/hibernate/ejb/test/hibernate.cfg.xml"/> -->
>> </properties>
>> </persistence-unit>
>> </persistence>
>>
>>
>> ------------------------------------------------------------------------
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>
>