[jboss-user] [EJB/JBoss] - Re: PostConstruct loadClass fails when porting to JBoss 5
jcstaff2
do-not-reply at jboss.com
Wed Jul 29 00:27:56 EDT 2009
I understand where your caution comes from about the ClassLoader after reading the spec, but when I read the Javadoc on getClass().getResource(), it sounds like it too is locating the ClassLoader. When I did some searching, I found that Tom Marrs (Lead Author, JBoss at Work: A Practical Guide) had the same solution as I did as late as 2006. http://www.coderanch.com/t/89900/JBoss/reading-properties-file
I spent the last few days building up a simple set of test cases where I loaded classes and resources from different types of ClassLoaders both inside and outside the EJB. In my simple test case, I could not recreate the problem. I finally tracked the issue down to the deployment descriptor. The JBoss 5 parsing of the deployment descriptor elements seems to now include white-space characters into values.
My class looked like the following...
| @Stateless
| public class TellerEJB implements TellerLocal, TellerRemote {
| ...
| @Resource(name="daoClass")
| protected String daoClassName;
|
| @PostConstruct
| public void init() {
| log.debug("init(), daoClass=" + daoClassName);
| teller = new TellerImpl();
|
| try {
| AccountDAO dao = (AccountDAO)Thread.currentThread()
| .getContextClassLoader()
| .loadClass(daoClassName)
| .newInstance();
|
My deployment descriptor was written as follows
| ...
| <enterprise-beans>
| <session>
| <ejb-name>TellerEJB</ejb-name>
| <env-entry>
| <env-entry-name>daoClass</env-entry-name>
| <env-entry-type>java.lang.String</env-entry-type>
| <env-entry-value>xxx.jpa.JPAAccountDAO
| </env-entry-value>
| </env-entry>
| </session>
| </enterprise-beans>
| </ejb-jar>
|
Note the line break after ...DAO and the line break in the original debug output. Once I removed the white-space from the deployment descriptor all worked.
| <enterprise-beans>
| <session>
| <ejb-name>TellerEJB</ejb-name>
| <env-entry>
| <env-entry-name>daoClass</env-entry-name>
| <env-entry-type>java.lang.String</env-entry-type>
| <env-entry-value>xxx.jpa.JPAAccountDAO</env-entry-value>
| </env-entry>
| </session>
| </enterprise-beans>
|
I've seen this same type of problem elsewhere in the processing of deployment descriptors by JBoss 5. In one post I saw where adding export JAVA_OPTS="-Dxb.builder.useUnorderedSequence=true" to the startup corrected the issue. I have not yet tried that for this issue.
So, in short. I may be violating what you think is wrong with my use of Thread.currentThread().getContextClassLoader(). However the problem in porting from JBoss 4 to JBoss 5 ended up being a whitespace interpretation change of the ejb-jar.xml between the two versions. JBoss 5 is adding extra whitespace to the injected String variable.
Thoughts?
View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4246592#4246592
Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4246592
More information about the jboss-user
mailing list