[jboss-user] [EJB 3.0] - Dependency injection is not working

daviddev do-not-reply at jboss.com
Tue Jul 7 05:00:00 EDT 2009


Hi guy,

I start to be a bit confuse with the dependency injection. I really want to understand how this works. 
I try several thinkg and sometime it is working sometimes not.
Basicaly I have an application (i.e. MM) which consists of a set of Message driven beans, beans, and entities that I want to used in another application (i.e. CMS) as a kind of sub-component.
So I do include MM in CMS (the ejb-jar.xml, and persistence.xml file are used to "configurate" MM). 
For some reason MM need to know the application (e.g. CMS) that is using it so I used the ejb-jar.xml file and a <env-entry> specification in each of my message driven and other beans to specify this information. 
Each bean (message driven or others) in MM has a property (i.e. applicationName) annotated with @Resource and a get and set method to access it.
It seems that the injection of the resource my approach is working only for message-driven bean but not the other beans and I do not understand why.

MM is deploy within CMS on JBOSS with a .ear file which as this structure:



  | CMS.EAR
  | 	|--META-INF
  | 	|     |--application.xml
  | 	|--CMC.jar (message driven and persitence beans)
  | 	|	|--META-INF
  | 	|		|--ejb-jar.xml
  | 	|--CMejb.jar (entities classes)
  | 	|	|--META-INF
  | 	|		|--persistence.xml
  | 	|--MMejb.jar (MM message driven beans)
  | 	|--MSMejb.jar (MM entity classes and persistence beans)
  | 	|--CMSweb.war (CMS servlet...)
  | 	|--MMweb.war (MM Servlet ...)
  | 

the application.xml in CMS.ear is:


  | <application>
  |   <display-name>CMS</display-name>
  |   <module>
  |     <ejb>lib/cmsconfiguratorclient.jar</ejb>
  |   </module>
  |   <module>
  |     <ejb>CMC.jar</ejb>
  |   </module>
  |   <module>
  |     <ejb>CMejb.jar</ejb>
  |   </module>
  |   <module>
  |     <web>
  |       <web-uri>CMSweb.war</web-uri>
  |       <context-root>CARDWeb</context-root>
  |     </web>
  |   </module>
  | 
  | <!-- MM -->
  |  
  |   <module>
  |   	<ejb>MMweb.war</ejb>
  |   </module>
  |   <module>
  |   	<ejb>MMejb.jar</ejb>
  |   </module>
  |   <module>
  |   	<ejb>MSMejb.jar</ejb>
  |   </module>
  | 
  | </application>
  | 

the ejb-jar.xml in CMC is 


  | <?xml version="1.0" encoding="UTF-8"?>
  | <ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
  | 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  | 	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
  | 	
  | 	<display-name>CMS</display-name>
  | 	<enterprise-beans>
  | 
  | 		<message-driven >
  | 			<display-name>MessagerReceiver</display-name>
  | 			<ejb-name>MessageReceiver</ejb-name>
  | 			<ejb-class>com.messaging.messagemanager.receiving.MessageReceiver</ejb-class>
  | 			<transaction-type>Container</transaction-type>
  | 			<activation-config>
  | 				<activation-config-property>
  | 					<activation-config-property-name>destinationType</activation-config-property-name>
  | 					<activation-config-property-value>javax.jms.Queue</activation-config-property-value>
  | 				</activation-config-property>
  | 				<activation-config-property>
  | 					<activation-config-property-name>destination</activation-config-property-name>
  | 					<activation-config-property-value>queue/CMS</activation-config-property-value>
  | 				</activation-config-property>
  | 			</activation-config>
  | 			<env-entry>
  |         		<description>The name of the application</description>
  |         		<env-entry-name>com.messaging.messagemanager.receiving.MessageReceiver/applicationName</env-entry-name>
  |         		<env-entry-type>java.lang.String</env-entry-type>
  |         		<env-entry-value>CMS</env-entry-value>
  |       		</env-entry>			
  | 		</message-driven>
  | 		
  | 		<session>
  | 			<ejb-name>IncomingMessageHandler</ejb-name>
  | 			<ejb-class>com.ecebs.multefile.messaging.messagemanager.receiving.IncomingMessageHandler</ejb-class>
  | 			<env-entry>
  |         		<description>The name of the application</description>
  |         		<env-entry-name>com.messaging.messagemanager.receiving.IncomingMessageHandler/applicationName</env-entry-name>
  |         		<env-entry-type>java.lang.String</env-entry-type>
  |         		<env-entry-value>CMS</env-entry-value>
  |       		</env-entry>
  | 		</session>
  | 		
  | 		<session>
  | 			<ejb-name>MessageStoreManagerBean</ejb-name>
  | 			<ejb-class>com.messaging.messagestoremanager.MessageStoreManagerBean</ejb-class>
  | 			<env-entry>
  |         		<description>The name of the application</description>
  |         		<env-entry-name>com.messaging.messagestoremanager.MessageStoreManagerBean/applicationName</env-entry-name>
  |         		<env-entry-type>java.lang.String</env-entry-type>
  |         		<env-entry-value>CMS</env-entry-value>
  |       		</env-entry>
  | 			<persistence-context-ref>
  | 				<persistence-context-ref-name>messagemanager_em</persistence-context-ref-name>
  | 				<persistence-unit-name>messagemanager</persistence-unit-name>
  | 			</persistence-context-ref>
  | 		</session>
  | 
  | 		
  | 	</enterprise-beans>
  | 
  | </ejb-jar>
  | 

all beans from MM are defined here with the same <env-entry>. here I put only few of them to make it short.
when I debug my application and send a mock message to the "MessagerReceiver" the "applicationName" is set with CMS so the dependency injection did work.
When i simulate I use the IncomingMessageHandler bean, the applicationName is not set with the value specified in the ejb-jar.xml (i.e. CMS).

here the code of the incomingMessageHandler bean and MessageReceiver message driven bean:

  | @Stateless
  | public class IncomingMessageHandler implements IIncomingMessageHandler{
  | 	
  | 	//...
  |   
  | 	@Resource
  |     private String applicationName;
  | 	
  | 	public String getApplicationName() {
  | 		return applicationName;
  | 	}
  | 	
  | 	public void setApplicationName(String applicationName) {
  | 		this.applicationName = applicationName;
  | 	}
  | 
  | 	//...
  | }
  | 
  | public class MessageReceiver implements MessageListener{
  | 	//...
  | 	
  | 	@Resource
  |     private String applicationName;
  | 	
  | 	public String getApplicationName() {
  | 		return applicationName;
  | 	}
  | 	
  | 	public void setApplicationName(String applicationName) {
  | 		this.applicationName = applicationName;
  | 	}
  | 
  | 	public void onMessage(Message message) {
  | 		//...
  | 	}
  | 	//...
  | 

a little help and explaination will be appreciated to understand what is wrong in my code/approach.
Any good references/internet link that could help me to understand the structure of an ear file or how to use ejb-jar.xml and persistence.xml in ear are also welcome.

Thanks a lot


View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4242124#4242124

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4242124



More information about the jboss-user mailing list