Hi Mark,
Using the chemistry-opencmis-client-binding-websphere-0.8.0.jar should
solve your problem. It cuts the dependency to the Sun JAX-WS
implementation, which can cause trouble even if you don't use the Web
Services binding.
The default bindings jar contains a configuration that forces JAX-WS to
use the Sun JAX-WS implementation. Depending on the classloader in the
application server that can have side effects for other web services
clients in the same application. In your case it seems JAX-WS finds the
Sun implementation that is part of the JRE. This is base on the RI 2.2
while OpenCMIS provides classes for the RI 2.1 and there seems to be a
compatibility issue.
The WebSphere bindings jar covers all CMIS bindings. You can use it even
if you are using the AtomPub or the Browser binding.
Florian
Hello
Please pardon the long post but I want to be clear in the description.
I am trying to chase down an issue we are seeing that "appears" to be
occurring based on the *order *of web service calls involving OpenCMIS
(0.8.0) RELEASE in a Websphere environment. We have a web application that
is deployed where we package the needed CMIS client-side JARs into
/WEB-INF/lib of the WAR:
chemistry-opencmis-client-api-0.8.0.jar
*chemistry-opencmis-client-bindings-0.8.0.jar*
chemistry-opencmis-client-impl-0.8.0.jar
chemistry-opencmis-commons-api-0.8.0.jar
chemistry-opencmis-commons-impl-0.8.0.jar
slf4j-api-1.6.x.jar
The application runs under Websphere 7, deploys and has worked perfectly
where we are able to make all the necessary calls to an Alfresco Community
4.2.b server. So far so good.
Also, we use only the AtomPub binding and do NOT make the calls using the
WSDL (JAX-WS) bindings approach.
Because of that we are *not including* the set of "dependency" JARs from
the JAX-WS RI (jaxws-api, jaxb-api, jaxws-rt, etc)...also more on this below
When setting up the client, we use this parameter when setting up and this
works just fine:
----
----
parameters.put(SessionParameter.BINDING_TYPE,
BindingType.ATOMPUB.value());
parameters.put(SessionParameter.ATOMPUB_URL, cmisServerAtomURL);
}
repositories = new ArrayList<Repository>();
repositories = this.sessionFactory.getRepositories(parameters);
We are able to get the Session, make all the required calls, and all seems
fine.
*HOWEVER, here is where we see a problem:*
- We *also *have our *own *JAX-WS client JAR for other web services
(non-CMIS) within our environment as well.
- The client artifacts for these are generated with JAX-WS RI 2.2 tools
with Ant ... but they *run from within the same web app where we make
CMIS calls deployed on WAS 7.0.0.13 / JDK 6* so we are dependent on the
WAS 7 runtime jars (we know that attempting to include JAX-WS RI - related
JAR files end up conflicting with those provided by the built-in Axis2
stack provided by WAS7). As stated before, we don't include the JAX-WS
dependency JAR files
- This JAX-WS client JAR that we create, is also placed in the
/WEB-INF/lib of the same WAR
1. If we use our JAX-WS client to call our services - that call works
2. If we then call the CMIS services (based on the AtomPub binding), *that
also works*
3. If we then use our JAX-WS client to AGAIN call our services - that
call now FAILS with an exception relating to the SOAP headers we attempt to
inject on our JAX-WS client calls
*<brief part of stack trace>*
org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to
insert a node where it is
not permitted. - WebServiceException caught:
javax.xml.ws.WebServiceException: org.w3c.dom.DOMException:
HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not
permitted.
at
com.sun.xml.internal.ws.handler.ClientSOAPHandlerTube.callHandlersOnRequest(ClientSOAPHandlerTube.java:147)
at ....
So we switch the call order above...to see what happens...
1. If we call the CMIS services (based on the AtomPub binding), that
call works
2. If we then use our JAX-WS client to call our services - that call now
FAILS with that same exception relating to the SOAP headers we attempt to
inject on our JAX-WS client calls
It *appears *that AFTER a call is made using the CMIS client JARs, any
attempt to call our JAX-WS web services via our own JAX-WS client will not
work.
After digging around some, I found the special Websphere binding JAR and
the text file describing the following:
This artifact is an OpenCMIS Client Bindings Jar that only works on
IBM WebSphere 7.0.0.5 and later. It takes advantage of the JAX-WS
implementation
provided by WebSphere, reduces OpenCMIS’ dependencies and avoids potential
conflicts with the Suns JAX-WS implementation that is usually required
for OpenCMIS.
In order to use the OpenCMIS client library in a web application on
WebSphere,
place the following jars into /WEB-INF/lib :
chemistry-opencmis-client-api-<version>.jar
chemistry-opencmis-client-impl-<version>.jar
*chemistry-opencmis-client-binding-websphere-<version>.jar*
chemistry-opencmis-commons-api-<version>.jar
chemistry-opencmis-commons-impl-<version>.jar
slf4j-api-1.6.x.jar
Other dependencies mentioned in other parts of the OpenCMIS documentation
are
not required. Make sure that the default OpenCMIS Client Bindings Jar
is not present.
I am now guessing, because we have NOT used this special *Websphere
version*for the client binding, this MAY be the problem..
Perhaps I mistakenly thought this was only needed if one was using the WSDL
binding option and making JAX-WS calls. However, when I open the
chemistry-opencmis-client-binding-websphere-0.8.0.jar , I do see classes
related to AtomPub as well.
Am I understanding this correctly?
Thanks
Mark