JBoss Web Service issues with JDK6
The past two weeks I've working on an exercise for the university. The task was to create Enterprise Java Beans (EJB) and Web Services (WS) which were then deployed to and run on the JBoss Application Server. We were using Eclipse Ganymede EE, Java JDK6 and JBoss version 5.0.1 GA for our purposes.
My colleagues and I had quite some troubles getting it all to work but eventually we managed it because most of the issues are documented and their resolutions are available on several sites somewhere on the net. Only this particular issue seemed to be covered nowhere or if it was, the solutions suggested did not work for us. I'm giving you the solution that worked for us here, maybe it helps somebody who runs into the same issues we've experienced.
Many people seem to succeed with the Instructions for using JBoss5 on Java6 from the JBoss Getting Started Guide, but for whatever reason this did not work for us. If you have the same problem persisting even after copying around the library-files, read on.
I hope the solution present here can also help you with your problem. If you have anything to add, find a mistake or can give any other feedback, please leave me a comment.
JBoss is up and running without trouble, having webservices deployed and visible on the webservice-endpoint overview at http://localhost:8080/jbossws/services. But upon calling one of the methods provided the JBoss chokes with the exception:
ERROR [SOAPFaultHelperJAXWS] SOAP request exception java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage at javax.xml.soap.SOAPMessage.setProperty(SOAPMessage.java:445) at org.jboss.ws.core.soap.SOAPMessageImpl.<init>(SOAPMessageImpl.java:82) at org.jboss.ws.core.soap.MessageFactoryImpl.createMessage(MessageFactoryImpl.java:215) ... (and some more exceptions with "setProperty must be overriden..." appearing several times)
and the webservice call fails with no result.
Quickly explained solution
- install JDK5 and add it to Eclipses installed Runtime Environments
- set JBoss execution environment to use JRE5
- set JRE in webservice-projects buildpath to JRE5
- set Project Facet in webservice-project for Java to 5.0
- download JDK5 from Sun
- install JDK5 (only JDK needed, no seperate JRE, docs, etc.)
- add JDK5 to Eclipse as Installed JRE (Window->Preferences->Java->Installed JREs->Search...)
- change startup configuration of JBoss to JDK5 (doublecklick on JBoss-entry in Servers-tab->General Information->Open launch configuration->JRE->Alternate JRE)
- change the projects JRE System Library to use JDK5. Either via right-click on the system library entry in the project->Properties or right-click on the project->Build Path->Configure Build Path->select "JRE System Library"->Edit. Then set the Alternate JRE to JDK5
- change the projects Java facet to JDK5 (right click on project->Properties->Project Facets->Change the setting next to the "Java" entry to "5.0"
- check, that in %JBOSS_PATH%/server/default/deploy (or your own configured deploy-path in JBoss) there are no .war-files left from your current project
- if not already suggested by Eclipse itself, rebuild the webservice project (if building automatically just clean the project via Project->Clean...)
- start JBoss via Eclipse
- check that somewhere near the beginning of the JBoss console log something like "Java Version: 1.5.xxx Sun Microsystems Inc" or "Java HotSpot(TM) Client VM 1.5.xxx" appears as "INFO [ServerInfo]" log line
If you are receiving errors like "java.lang.UnsupportedClassVersionError: Bad version number in .class file" then there is still something connected with JDK6 left in your project. Check the steps again and also your included libraries if there is something suspicious and then rebuild the project.
After all these steps you should finally be able to call web service methods on your endpoint without causing those exception anymore.
The technical details and origins of this error are explained in JBWS-2649 along with an initial solution. In short JRE/JDK6 includes a dummy-implementation for this setProperty() method which overrides the required implementation which is supplied with JBoss. The mentioned initial solution solves the problem by copying the supplied libraries to a location in the classpath where it should be loaded before the JRE libraries but as already mentioned this did not work for most of our class.